Это не изменяется код из шаблона iPhone 'Utility Aplication' Apple:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
MainViewController *aController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
self.mainViewController = aController;
[aController release];
mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
[window addSubview:[mainViewController view]];
[window makeKeyAndVisible];
}
Когда mainViewController
присваивают aController
, self
ключевое слово определяется:
self.mainViewController = aController;
Однако, когда mainViewController
кадр установлен, self
ключевое слово не требуется:
mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
Если я удаляю self
ключевое слово от первого примера, программа отказывает с сообщением:
objc[1296]: FREED(id): message view sent to freed object=0x3b122d0
Если я добавляю self
ключевое слово к второму примеру, прекрасные прогоны программы.
Может любой объяснять почему self
необходим в первом случае, но не второе? Я принимаю это в обоих случаях mainViewController
относится к той же переменной экземпляра.
Использование self приводит к вызову "сеттера" вашего класса для этой переменной, а не к изменению ivar напрямую.
self.mainViewController = aController;
эквивалентно:
[self setMainViewController:aController];
С другой стороны:
mainViewController = aController;
просто изменяет переменную экземпляра mainViewController
напрямую, пропуская любой дополнительный код, который может быть встроен в метод setMainViewController
UIApplication, такой как освобождение старых объектов, сохранение новых, обновление внутренних переменных и так далее.
В случае, когда вы обращаетесь к фрейму, вы все равно вызываете метод сеттера:
mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
расширяется до:
[[mainViewController view] setFrame:[[UIScreen mainScreen] applicationFrame]];
В идеале, чтобы обезопасить свой код на будущее, вы также должны использовать self.mainViewController
(или [self mainViewController]
) при получении этого значения. В целом, классы гораздо реже содержат важный код в своих методах "getter", чем в своих "setters", но все же возможно, что прямой доступ может сломать что-то в будущей версии Cocoa Touch.
ключевое слово self
указывает на то, что вы используете getter/setter свойства вместо прямого доступа к значению. в случае, если вы позволяете getter/setter автоматически генерироваться с помощью synchronize, вы должны использовать self в первом примере, потому что объект сохраняется там, а не просто присваивается указателем.