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

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

или

- (void)dealloc {
    [receivedData release]; receivedData = nil;
    [super dealloc];
}
10
задан Sheehan Alam 19 August 2010 в 15:47
поделиться

3 ответа

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

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

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

   [super dealloc];
}
16
ответ дан 3 December 2019 в 14:33
поделиться

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

13
ответ дан 3 December 2019 в 14:33
поделиться

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

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

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

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

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

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

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

4
ответ дан 3 December 2019 в 14:33
поделиться