Безопасно ли переопределять `release` для отладки? - PullRequest
7 голосов
/ 18 апреля 2010

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

-(void)release {
    NSLog(@"I'm released");
    [super release];
}

Но проблема в том, что это безопасно делать ? Могу ли я получить какие-либо проблемы при переопределении -(void)release. Кроме того, это действительно void? А что, если я создаю свое приложение для распространения, но в случае аварии оставляю его там? Или это просто безопасно? Спасибо

Ответы [ 2 ]

19 голосов
/ 18 апреля 2010

Это нормально, но, пожалуйста, ограничьте его только для отладки.


Это не void, а oneway void.

-(oneway void)release {
    NSLog(@"I'm released"); // <-- remeber the @.
    [super release];
}

Обратите внимание, что если вы переопределите это только для NSObject, то сообщения -release, отправленные в "бесплатные мостовые контейнеры" (например, NSCFArray и т. Д.), Будут пропущены, поскольку они также переопределяют -release для пересылки на CFRelease.

5 голосов
/ 18 апреля 2010

Сообщение о выпуске только уменьшает счетчик ссылок экземпляра.

Если вы хотите знать, был ли экземпляр выпущен, тогда лучше всего переопределить сообщение dealloc:

- (void)dealloc {
    NSLog(@"I am deallocated");
    [super dealloc];
}

Используйте это с умом.

...