Кто вызывает метод dealloc и когда в Objective C? - PullRequest
14 голосов
/ 17 августа 2011

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

Ответы [ 4 ]

17 голосов
/ 17 августа 2011

Вы никогда не отправляете сообщение dealloc напрямую.Вместо этого метод dealloc объекта вызывается косвенным образом через метод протокола NSObject выпуска (если сообщение освобождения приводит к тому, что счетчик сохранения получателя становится равным 0).См. Руководство по программированию для управления памятью для получения более подробной информации об использовании этих методов.

Подклассы должны реализовывать свои собственные версии dealloc, чтобы разрешить освобождение любой дополнительной памяти, используемой объектом, например, динамически выделяемое хранилище для данных илиПеременные экземпляра объекта, принадлежащие освобожденному объекту.После выполнения освобождения конкретного класса метод подкласса должен включать версии dealloc суперкласса через сообщение super:

Внимание: обратите внимание, что при завершении приложения объекты не могут отправлять сообщение dealloc, так как память процессаавтоматически очищается при выходе - более эффективно просто позволить операционной системе очищать ресурсы, чем вызывать все методы управления памятью.По этой и другим причинам вам не следует управлять дефицитными ресурсами в dealloc

 - (void)release
 {
   _retainCount--;
   if (_retainCount == 0) {
       [self dealloc];
    }
  }
5 голосов
/ 17 августа 2011

Представьте себе, что -release реализован в NSObject следующим образом:

- (void)release
{
    _retainCount--;
    if (_retainCount == 0) {
        [self dealloc]
    }
}

Я уверен, что это немного сложнее, но ответ на ваш вопрос заключается в том, что сам объект будет вызывать -dealloc, когда количество сохранений падает до нуля.Однако ваш пользовательский класс будет наследовать это поведение от NSObject.Вам никогда не понадобится вызывать -dealloc самостоятельно в написанном вами коде;это всегда будет происходить автоматически, когда объект правильно отпущен.

2 голосов
/ 17 августа 2011

dealloc вызывается в результате управления памятью .Как только объект "retainCount" достигнет 0, тогда на этот объект автоматически отправляется сообщение dealloc.

Вы никогда не должны вызывать dealloc для объектов, если это не вызов [super 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).Подробнее об использовании этих методов см. Руководство по программированию управления памятью .

1 голос
/ 17 августа 2011

Среда выполнения сделает это за вас, когда объект больше не нужен (что решает и среда исполнения).Просто убедитесь, что вы сохраняете и отпускаете правильно.Не вызывайте dealloc для других объектов.

...