Когда пользовательский класс создается в Objective C, когда и как вызван метод dealloc
? Это что-то, что я должен каким-то образом реализовать в своем классе?
Кто называет метод dealloc и когда в Objective C?
Ответ 1
Вы никогда не отправляете сообщение dealloc напрямую. Вместо этого метод dealloc объектов вызывается косвенно через метод протокола NSObject выпуска (если сообщение о выпуске приводит к тому, что счетчик удержания приемника становится 0). Дополнительную информацию об использовании этих методов см. В руководстве по программированию памяти.
Подклассы должны реализовывать свои собственные версии dealloc, чтобы разрешить выпуск любой дополнительной памяти, потребляемой объектом, - например, динамически распределенное хранилище для переменных данных или объектов, принадлежащих освобожденному объекту. После выполнения освобождения класса для класса метод подкласса должен включать версии dealloc в суперклассе через сообщение для супер:
Важно: обратите внимание, что когда приложение завершается, объекты не могут быть отправлены dealloc поскольку память процесса автоматически очищается при выходе - она более эффективна просто чтобы операционная система могла очищать ресурсы, чем вызывать всю память методы управления. По этой и другим причинам вы не должны управлять ограниченными ресурсами в dealloc
- (void)release
{
_retainCount--;
if (_retainCount == 0) {
[self dealloc];
}
}
Ответ 2
Представьте, что в NSObject реализован -release
:
- (void)release
{
_retainCount--;
if (_retainCount == 0) {
[self dealloc]
}
}
Я уверен, что это немного сложнее, но ответ на ваш вопрос заключается в том, что сам объект будет называть -dealloc
, когда его количество удержания падает до нуля. Однако ваш пользовательский класс наследует это поведение от NSObject. Вам никогда не понадобится вызывать -dealloc самостоятельно в коде, который вы пишете; это всегда произойдет автоматически, когда объект был правильно выпущен.
Ответ 3
dealloc
вызывается в результате управления памятью. Когда объекты "keepCount" достигают 0, сообщение dealloc автоматически отправляется на этот объект.
Вы не должны вызывать dealloc для объектов, если это не вызов [super dealloc];
в конце переопределенного dealloc.
-(void)dealloc
{
[ivar release]; //Release any retained variables before super dealloc
[super dealloc]; //Only place in your code you should ever call dealloc
}
И в соответствии с - [NSObject dealloc] обсуждение
Вы никогда не отправляете сообщение dealloc напрямую. Вместо этого объекты Метод dealloc вызван косвенно через выпуск NSObject протокола (если сообщение о выпуске приводит к сохранить счет становится 0). См. Руководство по программированию управления памятью для более подробная информация об использовании этих методов.
Ответ 4
Среда выполнения сделает это для вас, когда объект больше не нужен (что также определяет время исполнения). Просто убедитесь, что вы сохранили и отпустили правильно. Не вызывайте dealloc для других объектов.