Когда вы ссылаетесь на editingViewController
, это эквивалентно self->editingViewController
, то есть доступу к ивару.
Если вы хотите использовать геттер или сеттер, вам нужно использовать self.editingViewController
, или эквивалентно [self setEditingViewController:aController]
.
Именно поэтому я предпочитаю использовать ивар с другим именем для свойства, например:
EditingViewController* i_editingViewController;
@property (nonatomic, retain) EditingViewController *editingViewController;
@synthesize editingViewController = i_editingViewController;
Тогда вы можете написать свой ленивый получатель как:
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
i_editingViewController = [[EditingViewController alloc] init];
}
return i_editingViewController;
}
или
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
EditingViewController *aController = [[EditingViewController alloc] init];
self.editingViewController = aController;
[aController release];
}
return i_editingViewController;
}
Я бы, вероятно, использовал первый метод (не вызывая сеттер), потому что значение editingViewController
(как замечено любым наблюдателем) в действительности не изменилось, но в любом случае должно работать нормально, и другое имя (для ivar и свойства) ) поможет избежать путаницы или случайного неправильного использования. Это также мягкое поощрение использования свойства (так как оно избегает слегка уродливого префикса).
Обратите внимание, что Apple резервирует префикс _, и что сеттеры и геттеры не должны использоваться в подпрограммах init
/ dealloc
.