В методе освобождения UIView вы освобождаете свои свойства до или ПОСЛЕ [super dealloc]?

#iphone #cocoa-touch #ios4 #memory-management

#iPhone #cocoa-touch #ios4 #управление памятью

Вопрос:

У меня есть пользовательский UIView, который загружается через перо внутри UIViewController.

Я весь день боролся с -[UIScrollView retainCount]: сообщение, отправленное в освобожденный экземпляр с ошибкой.

Мой пользовательский метод освобождения подкласса UIView выглядел следующим образом:

 -(void)dealloc {
    [myScrollView dealloc];
    [someProperty dealloc];
    [super dealloc];
}
  

Проблема заключалась в том, что он всегда зависал при [super dealloc] из-за [myScrollView dealloc], предшествующего ему.

Когда я изменил метод на:

 -(void)dealloc {
   [super dealloc];
   [myScrollView dealloc];
   [someProperty dealloc];
}
  

Все работает нормально. Мой вопрос в том, имеет ли значение, вызывается ли [super dealloc] первым или последним? В большинстве примеров я вижу, что он вызывается последним.

Комментарии:

1. Почему вы звоните retainCount ? Вы никогда не должны вызывать retainCount .

Ответ №1:

[super dealloc] всегда должен быть последний вызов в dealloc . Ваша проблема в том, что вы должны вызывать release другие объекты, а не dealloc . dealloc вызывается средой выполнения, когда количество выпусков объекта достигает нуля, ваш код никогда не должен вызывать его напрямую.

Следовательно, ваш код должен выглядеть следующим образом:

 -(void)dealloc {
    [myScrollView release];
    [someProperty release];
    [super dealloc];
}