Разница между выпуском и dealloc в objective-c
При отмене повторения я видел, что release
и dealloc
используются, например,
-(void)dealloc
{
[foo release];
[nar dealloc];
[super dealloc];
}
Мой вопрос: когда используется release
и когда используется dealloc
?
Спасибо
Ответы
Ответ 1
Никогда не вызывайте dealloc
за исключением [super dealloc]
в конце вашего класса dealloc
. Метод release
отказывается от права собственности на объект. Когда объект Cocoa больше не имеет владельцев, он может быть освобожден - в этом случае ему будет автоматически отправлено сообщение dealloc
.
Если вы собираетесь запрограммировать Cocoa, вам необходимо прочитать Руководство по управлению памятью. Это невероятно просто, как только вы преодолеете начальный горб, и если вы не понимаете, что в этом документе, у вас будет много тонких ошибок.
Ответ 2
Оператор dealloc
в вашем примере вызывается, когда счетчик объектов остается равным нулю (через объект, отправляющий его сообщение о выпуске).
Поскольку он больше не нужен, он очищается, отправляя сообщение release
на объекты, на которые он держится.
Ответ 3
Вы никогда не должны явно вызывать dealloc (если только он не был отменен в методе dealloc, но это единственное исключение). Objective-C обрабатывает управление памятью посредством подсчета ссылок, поэтому вы просто должны соответствовать вашим allocs/сохраняет с релизами/автореализациями и позволить объекту деконструировать себя.