Самоубийство: объекты Objective-C, вызывающие свои собственные методы -dealloc для себя - PullRequest
1 голос
/ 29 сентября 2010

Является ли хорошей практикой для объекта в Objective-C совершать самоубийство? То есть для объекта, чтобы объявить [self dealloc], где -dealloc разрешает упорядоченное свертывание, как обычно? Каковы основные риски?

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

Для более подробного объяснения см. Мой пост на здесь .

Ответы [ 2 ]

9 голосов
/ 29 сентября 2010

Вы не должны звонить -dealloc.Вместо этого вызовите [self release], чтобы счетчик обращался к 0, и пусть системный вызов -dealloc.

8 голосов
/ 29 сентября 2010

Является ли хорошей практикой для объекта в Objective-C совершать самоубийство? То есть для объекта, чтобы объявить [self dealloc], где -dealloc разрешает упорядоченное свертывание как обычно? Каковы основные риски?

номер

В только раз, когда вам нужно написать вызов dealloc, необходимо отправить dealloc суперобъекту в методе dealloc одного из ваших классов. Без исключений.

Если вы попытаетесь отправить Deloc на объект в любое другое время, вы рискуете оставить другие объекты с висящими указателями. Не делай этого.


Должны ли вы когда-нибудь отправлять релиз самому себе? Это другое дело, но вы все равно должны соблюдать Правила управления памятью . Если вы отправили сохранение для себя, то в какой-то момент вам нужно будет отправить освобождение для себя. Есть одно исключение, которое есть в init, если при инициализации происходит сбой, вы должны освободить себя и вернуть nil (я думаю, вы могли бы утверждать, что alloc послал retain для себя).

...