objective-C – Когда использовать «я»,

Это немодифицированный код из шаблона Apple Apple Utility Aplication:

- (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 , 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 заставляет «setter» вашего classа «вызывать» эту переменную, а не напрямую менять ivar.

 self.mainViewController = aController; 

эквивалентно:

 [self setMainViewController:aController]; 

С другой стороны:

 mainViewController = aController; 

просто изменяет непосредственно переменную экземпляра mainViewController , пропуская любой дополнительный код, который может быть встроен в метод setMainViewController в setMainViewController , например, setMainViewController старых объектов, сохранение новых, обновление внутренних переменных и т. д.

В случае, когда вы получаете доступ к кадру, вы все еще вызываете метод setter:

 mainViewController.view.frame = [UIScreen mainScreen].applicationFrame; 

расширяется до:

 [[mainViewController view] setFrame:[[UIScreen mainScreen] applicationFrame]]; 

В идеале, для будущего доказательства вашего кода, вы также должны использовать self.mainViewController (или [self mainViewController] ) при получении этого значения. В общем, classы гораздо реже имеют важный код в своих методах «getter», чем их «сеттеры», но все же возможно, что доступ непосредственно может нарушить что-то в будущей версии Cocoa Touch.

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

  • Формат NSDate, выводящий неверную дату
  • Синглтон в iOS 5?
  • Позиционирование MKMapView для одновременного отображения нескольких аннотаций
  • UITableViewCell расширяется по клику
  • Создайте случайную буквенно-цифровую строку в Cocoa
  • Получение списка файлов в каталоге с глобусом
  • Как я могу добавить объекты CGPoint в NSArray простым способом?
  • Округленный UIView с использованием CALayers - только некоторые углы - как?
  • Как я могу получить объект NSDate на сегодня в полночь?
  • Какова максимальная длина объекта NSString?
  • Программный пример UIPickerView?
  • Interesting Posts
    Давайте будем гением компьютера.