Apple рекомендует не вызывать сеттеры в процедурах init и, особенно, в dealloc.
Это связано с тем, что объект настроен только частично, и сеттеры могут иметь прикрепленных к ним наблюдателей, или могут быть переопределены подклассами, и в противном случае иметь нежелательные эффекты во время освобождения или могут быть спутаны init с частично настроенным объектом.
Следовательно, вы обычно используете:
_navigationController = [[NavController alloc] init];
код стиля в вашей процедуре инициализации,
[_navigationController release];
Код стиля
в вашем dealloc и сеттеры в другом коде, где, как известно, объект полностью завершен.
Некоторые случаи для рассмотрения:
- Подкласс переопределяет setNavigationController и ссылается на свои собственные ivars, выделенные init. Сбой при инициализации.
- Подкласс переопределяет setNavigationController и ссылается на свои собственные ivars, выпущенные в dealloc. Сбой при ударе.
- Подкласс переопределяет setNavigationController и перерисовывает некоторые части экрана. Бессмысленная трата циклов или глючный дисплей.
- Другие объекты, освобождаемые одновременно, наблюдают за навигационным контроллером, и эти наблюдатели срабатывают во время освобождения
- и т.д.