Имеет ли значение, когда super вызывается в dealloc? - PullRequest
10 голосов
/ 19 августа 2010
- (void)dealloc {
    [super dealloc];
    [receivedData release]; receivedData = nil;
}

или

- (void)dealloc {
    [receivedData release]; receivedData = nil;
    [super dealloc];
}

Ответы [ 3 ]

16 голосов
/ 19 августа 2010

Да, это абсолютно важно, когда [super dealloc] вызывается. После вызова [super dealloc] вы больше не можете полагаться на механизм NSObject (или каков ваш корневой класс) для правильной работы. В конце концов, ваш метод суперкласса '-dealloc должен вызывать свой суперкласс' и т. Д., Пока не будет вызван метод корневого класса '-dealloc. В этот момент все, что эти классы выделяют для выполнения своей работы, потенциально исчезает, и вы попадаете на неопределенную территорию, если попытаетесь использовать какой-либо из них.

Ваш -dealloc метод всегда должен выглядеть как

- (void)dealloc
{
   // release my own stuff first

   [super dealloc];
}
13 голосов
/ 19 августа 2010

Да.Прошлой.Всегда.

4 голосов
/ 19 августа 2010

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

Anдополнительная причина, не упомянутая выше, заключается в том, что ивары находятся в порции памяти, на которую указывает self, поэтому, если бы вам пришлось что-то делать (например, освободить) эти ивары после [super dealloc], вы также разыменовывали бы освобожденную память.

Я сказал «может произойти сбой» выше, потому что, если вы делаете это неправильно, это имеет тенденцию фактически не падать, что имеет смысл, учитывая, что память не перезаписывается, пока не будет использована повторно.Это делает все это еще хуже, потому что у вас потенциально может быть ошибка, которая возникает только иногда, что делает ее более трудной для поиска в случае, если она действительно взорвется вам в лицо.

Кроме этого, вы в порядкеесли вы отпускаете локальную переменную или еще много чего после [super dealloc], и вы можете, если вы действительно хотите, сделать что-то вроде

id local = ivar;
[super dealloc];
[local release];

безопасно, но в интересах согласованности этого не делать.

В итоге, да, [super dealloc] должен быть последним в -dealloc.

...