Метод dealloc вызывается для объекта, когда его счетчик сохранения достиг нуля.Количество удержаний увеличивается на единицу для каждого retain
вызова и уменьшается один раз для каждого release
вызова.autorelease
планирует будущий вызов release
, когда текущий NSAutoreleasePool опустошается, обычно в конце цикла событий, но вы можете настроить свои собственные NSAutoreleasePools для операций с интенсивным использованием памяти.(Подробности смотрите в документации NSAutoreleasePool.)
Что вы должны положить в dealloc?Вы должны поставить релиз для каждого объекта-члена, который сохраняет объект этого класса.
Несколько вещей делают это проще.Объект nil будет спокойно игнорировать любые отправленные ему сообщения, поэтому [foo release], когда foo = nil не является ошибкой.Однако двойное освобождение объекта может вызвать серьезные проблемы.Мое (едва ли уникальное) решение этой проблемы состоит в том, чтобы явно установить все, что я только что выпустил, равным нулю, всякий раз, когда я выпускаю это.Фактически, я помещаю нулевое назначение в ту же строку, что и выпуск, чтобы я мог найти "выпуск" и найти места, которые я пропустил.Пример:
@interface MyClass {
Foo *foo;
Bar *bar;
NSInteger baz;
}
-(void)dealloc;
@end
@implementation MyClass
-(void)dealloc {
[foo release]; foo = nil;
[bar release]; bar = nil;
[super dealloc];
}
@end
Я назначу nil для переменной , даже когда эта переменная собирается выйти из области действия или объект собирается исчезнуть. Зачем?Если другой объект того же класса будет размещен в том же пространстве памяти после того, как я выпустил этот, это гарантирует , что не будет никаких висячих указателей, которые новый объект мог бы случайно использовать и сделать отладку кошмаром.(См. Также NSZombieEnabled для справки по отладке.)