- (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
или любые другие внутренние элементы, обычно принимаемые как должное, не работать и может привести к сбою, как также было сказано выше.
Дополнительная причина, не упомянутая выше, заключается в том, что ivars находятся в части памяти, на которую указывает self
, поэтому, если вы должны были что-то сделать с (например, освободить) эти ivars после [super dealloc ]
, вы также будете разыменовывать освобожденную память.
Я сказал выше «может произойти сбой», потому что, когда вы делаете это неправильно, сбой обычно не происходит, что имеет смысл, учитывая, что память не перезаписывается до тех пор, пока она не будет повторно использована. Это усугубляет ситуацию, потому что у вас потенциально может быть ошибка, которая возникает только иногда, что затрудняет ее обнаружение в случае, если она действительно взорвется у вас перед лицом.
В остальном все в порядке, если вы выпускаете локальную переменную или еще что-то после [super dealloc]
, и вы можете, если действительно хотите, безопасно сделать что-то вроде
id local = ivar;
[super dealloc];
[local release];
, но не делайте этого в интересах последовательности.
Подводя итог, да, [super dealloc]
должен быть последним в -dealloc.