Самоубийство: объекты 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.

Другие вопросы по тегам