Самоубийство: объекты Objective-C сами вызывают свои методы -dealloc
Является ли хорошей практикой для объекта в Objective-C совершить самоубийство? То есть для объекта, чтобы объявить [self dealloc]
где -dealloc
разрешает упорядоченное сворачивание как обычно? Каковы основные риски?
Как это происходит, у меня есть конкретный пример, пользовательский объект таймера, который расширяет NSObject и содержит экземпляр NSTimer и NSUInteger, который установлен для ограничения количества срабатываний таймера. Когда время истекло, объект сообщает таймеру -invalidate
а затем совершает самоубийство, называя его -dealloc
метод. Поскольку это автоматический режим, мы не беспокоимся о том, что нужно отслеживать объект, и не знаем, когда наступит подходящий момент для его освобождения.
Для более подробного объяснения смотрите мой пост здесь.
2 ответа
Является ли хорошей практикой для объекта в Objective-C совершить самоубийство? То есть для объекта, чтобы объявить [self dealloc], где -dealloc разрешает упорядоченное сворачивание как обычно? Каковы основные риски?
Нет.
Единственный раз, когда вам нужно написать вызов dealloc - это отправить dealloc суперобъекту в методе dealloc одного из ваших классов. Без исключений.
Если вы попытаетесь отправить dealloc объекту в любое другое время, вы рискуете оставить другие объекты с висящими указателями. Не делай этого.
Стоит ли когда-нибудь отправлять релиз самому себе? Это другое дело, но вы все равно должны следовать правилам управления памятью. Если вы отправили сохранение для себя, то в какой-то момент вам нужно будет отправить освобождение для себя. Есть одно исключение, которое есть в init, если при инициализации происходит сбой, вы должны освободить self и вернуть nil (я думаю, вы могли бы утверждать, что alloc отправил retain для self).
Вы не должны звонить -dealloc. Вместо этого вызовите [self release], чтобы счетчик обращался к 0, и пусть системный вызов -dealloc.