Вставляет ли ARC код в -dealloc до или после любого пользовательского кода -dealloc? - PullRequest
3 голосов
/ 23 января 2012

Иногда с ARC мне все равно нужно написать метод -dealloc для некоторой очистки.В некоторых редких случаях мне нужно обратиться к свойствам экземпляра, чтобы правильно выполнить очистку.Например, отмена регистрации в NSNotificationCenter с заданным объектом отправителя, владельцем и ссылкой которого является свойство.

Вставляет ли ARC свой код выпуска свойства в конце после моего собственного кода или вставляет его в начале-dealloc, перед моим собственным кодом?

Если ARC будет вставлять код перед любым пользовательским кодом -dealloc, то это будет очень опасно, так как вы больше не сможете получить доступ к свойствам, если это необходимо.

Этот вопрос о том, где ARC вставляет код освобождения свойства в синтезированный -dealloc, а не о том, нужно ли или не реализовывать -dealloc.

Ответы [ 2 ]

7 голосов
/ 23 января 2012

Я думаю, что здесь все сказано: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.special_methods.dealloc

7.1.2.dealloc

Программа плохо сформирована, если она содержит выражение отправки или @selector для селектора dealloc.

Обоснование: нет законных причин для непосредственного вызова dealloc.

Класс может предоставить определение метода для метода экземпляра с именем dealloc.Этот метод будет вызываться после окончательного освобождения объекта, но до его освобождения или уничтожения любой из его переменных экземпляра.Реализация dealloc суперкласса будет вызываться автоматически при возврате метода.

Обоснование: даже если ARC уничтожает переменные экземпляра автоматически, все же есть веские причины для написания метода dealloc, например, освобождение ресурсов, не подлежащих сохранению.Неспособность вызвать [super dealloc] в таком методе - почти всегда ошибка.Иногда объект просто пытается предотвратить самоуничтожение, но dealloc действительно слишком поздно для того, чтобы объект выдвигал такие возражения.Несколько более законно, объект, возможно, был распределен пулом и не должен быть освобожден со свободным;на данный момент это может поддерживаться только реализацией dealloc за пределами ARC.Такая реализация должна быть очень осторожной, чтобы выполнять всю остальную работу, которую выполняет Deloc для NSObject, что выходит за рамки этого документа.

4 голосов
/ 23 января 2012

ARC освобождает переменные экземпляра в конце цепочки dealloc.Другими словами, все методы dealloc в цепочке наследования выполняются, и затем любые переменные экземпляра, управляемые ARC, будут освобождены.Вы могли бы думать, что это происходит в -[NSObject dealloc], хотя на самом деле это даже позже.

Так что будьте уверены;ARC не будет освобождать ваши свойства из-под вас в вашем -dealloc методе.ARC не выпустит их, пока у вас не будет возможности сослаться на них.

...