Имеет ли значение, когда супер вызывается в dealloc?

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

или

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

Ответ 1

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

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

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

   [super dealloc];
}

Ответ 2

Да. Последний. Всегда.

Ответ 3

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

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

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

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

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

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

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