Кто называет метод dealloc и когда в Objective C?

Когда пользовательский класс создается в Objective C, когда и как вызван метод dealloc? Это что-то, что я должен каким-то образом реализовать в своем классе?

Ответ 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 для других объектов.