Просто чтобы дать противоположный ответ ...
Краткий ответ : нет, вам не нужно обнулять автоматически синтезированные свойства в dealloc
в ARC. И вам не нужно использовать сеттер для тех, кто в init
.
Длинный ответ : Вы должны исключить пользовательские синтезированные свойства в dealloc
, даже в ARC. И вы должны использовать сеттер для тех, кто в init
.
Дело в том, что ваши пользовательские синтезированные свойства должны быть безопасными и симметричными относительно аннулирования.
Возможный установщик таймера:
-(void)setTimer:(NSTimer *)timer
{
if (timer == _timer)
return;
[timer retain];
[_timer invalidate];
[_timer release];
_timer = timer;
[_timer fire];
}
Возможный установщик для просмотра прокрутки, просмотра таблицы, веб-просмотра, текстового поля, ...:
-(void)setScrollView:(UIScrollView *)scrollView
{
if (scrollView == _scrollView)
return;
[scrollView retain];
[_scrollView setDelegate:nil];
[_scrollView release];
_scrollView = scrollView;
[_scrollView setDelegate:self];
}
Возможный установщик для свойства KVO:
-(void)setButton:(UIButton *)button
{
if (button == _button)
return;
[button retain];
[_button removeObserver:self forKeyPath:@"tintColor"];
[_button release];
_button = button;
[_button addObserver:self forKeyPath:@"tintColor" options:(NSKeyValueObservingOptions)0 context:NULL];
}
Тогда вам не нужно дублировать код для dealloc
, didReceiveMemoryWarning
, viewDidUnload
, ..., и ваша собственность может быть безопасно обнародована. Если вы беспокоитесь о свойствах nil out в dealloc
, то, возможно, пришло время снова проверить ваши установщики.