- (void)dealloc {
[super dealloc];
[receivedData release]; receivedData = nil;
}
или
- (void)dealloc {
[receivedData release]; receivedData = nil;
[super dealloc];
}
- (void)dealloc {
[super dealloc];
[receivedData release]; receivedData = nil;
}
или
- (void)dealloc {
[receivedData release]; receivedData = nil;
[super dealloc];
}
Да, это абсолютно важно, когда вызывается [super dealloc]
. После вызова [super dealloc]
вы больше не можете полагаться на механизм NSObject
(или любого другого корневого класса) для правильной работы. В конце концов, ваш метод -dealloc
суперкласса должен вызывать свой суперкласс "и т.д., Пока не будет вызван метод корневого класса -dealloc
. В этот момент все, что эти классы выделяют для выполнения своей работы, потенциально исчезает, и вы попадаете на неопределенную территорию, если попытаетесь использовать какой-либо из них.
Ваш метод -dealloc
всегда должен выглядеть как
- (void)dealloc
{
// release my own stuff first
[super dealloc];
}
Да. Последний. Всегда.
Да, [super dealloc]
всегда должен быть последним, как сказано выше, потому что ссылка на self
или любые другие внутренние компоненты, которые обычно считаются само собой разумеющимися, не будет работать и может привести к сбою, как также сказано выше.
Еще одна причина, не упомянутая выше, заключается в том, что ивары находятся в той части памяти, на которую указывает self
, поэтому, если вы должны были что-то делать с (например, выпустить) этими иварами после [super dealloc]
, вы также разыменовывали бы освобожденную память.
Я сказал "может произойти сбой" выше, потому что, если вы сделаете это неправильно, это, как правило, не приведет к сбою, что имеет смысл, учитывая, что память не перезаписывается, пока не будет использована повторно. Это делает все это еще хуже, потому что у вас потенциально может быть ошибка, которая возникает только иногда, что делает ее более трудной для поиска в случае, если она действительно взорвется вам в лицо.
Кроме этого, у вас все в порядке, если вы выпускаете локальную переменную или еще много чего после [super dealloc]
, и вы можете, если вы действительно хотите, сделать что-то вроде
id local = ivar;
[super dealloc];
[local release];
безопасно, но в интересах последовательности, не.
В итоге, да, [super dealloc]
должно быть последним в -dealloc.