Как удалить наблюдателя с объекта под ARC ? Мы просто добавляем наблюдателя и забываем об его удалении? Если мы больше не управляем памятью вручную, где мы откажемся от наблюдения?
Например, на контроллере представления:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Раньше я бы вызвал метод removeObserver:
контроллера представления dealloc
.
@"frame"
а не@"self.frame"
?Ответы:
Вы по-прежнему можете реализовать
-dealloc
в ARC, который кажется подходящим местом для удаления наблюдения за ключевыми значениями. Вы просто больше не звоните[super dealloc]
из этого метода.Если
-release
раньше вы преобладали , значит, вы поступали неправильно.источник
[super dealloc]
. Кто еще должен сделать это за вас.[super dealloc]
метод dealloc. Не знаю, как это будет работать тогда при создании подкласса упомянутого класса. Возможно, лучше использоватьfinalize
вместо этого (там, где вы звоните[super finalize]
)[super dealloc]
последним в этом методе почти всегда является ошибкой при ручном управлении памятью, компилятор обрабатывает это за вас сейчас, поэтому вы больше не можете вызывать-dealloc
напрямую. Единственное, что вы помещаете в-dealloc
метод в ARC, - это любые не объектные ресурсы, которые вам нужно освободить, или задачи очистки, такие как удаление наблюдателей. Формулировка, которую они используют, немного нечеткая, но они имели в виду именно это.-finalize
используется для этого в сборке мусора, где-dealloc
никогда не вызывается, но вполне приемлемо разместить этот код в-dealloc
ARC.[super dealloc]
вызывается автоматически, поэтому вызывать его в ARC - ошибка.Я делаю это с помощью этого кода
- (void)dealloc { @try{ [self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil]; } @catch(id anException) { //do nothing, obviously it wasn't attached because an exception was thrown } }
источник
dealloc
? Слишком поздно что-либо делать.В другом месте, посвященном переполнению стека, Крис Хэнсон советует использовать для этой цели метод finalize и реализовать отдельный метод недействительности, чтобы владельцы могли сообщить объектам, что они выполнены. Раньше я считал, что решения Hanson хорошо продуманы, поэтому я буду придерживаться этого.
источник
-dealloc
никогда не вызывается. В ARC это так. Совершенно приемлемо удалить наблюдателей KVO, как-dealloc
указывает Крис Латтнер (который знает, о чем он говорит) на форумах разработчиков Apple здесь: devforums.apple.com/message/475850