Objective C - Когда использовать 'сам'

Это не изменяется код из шаблона 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 относится к той же переменной экземпляра.

49
задан Steve Harrison 5 March 2010 в 01:02
поделиться

2 ответа

Использование 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.

49
ответ дан 7 November 2019 в 11:53
поделиться

ключевое слово self указывает на то, что вы используете getter/setter свойства вместо прямого доступа к значению. в случае, если вы позволяете getter/setter автоматически генерироваться с помощью synchronize, вы должны использовать self в первом примере, потому что объект сохраняется там, а не просто присваивается указателем.

11
ответ дан 7 November 2019 в 11:53
поделиться