Как удалить наблюдателя из объекта в ARC? Добавляем ли мы наблюдателя и забываем об удалении его? Если мы больше не будем управлять памятью вручную, когда мы уходим из наблюдения?
Например, на контроллере представления:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Раньше я бы назвал removeObserver:
в методе контроллера dealloc
.
Ответ 1
Вы все еще можете реализовать -dealloc
в ARC, который, по-видимому, является подходящим местом для удаления наблюдения за значениями ключа. Вы просто не вызываете [super dealloc]
из этого метода больше.
Если раньше вы переопределяли -release
, вы делали неправильный путь.
Ответ 2
Я делаю это с помощью этого кода
- (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
}
}
Ответ 3
В другом месте о переполнении стека, Крис Хэнсон советует использовать метод finalize для этой цели и внедрять отдельный метод invalidate, чтобы владельцы могли сообщать объекты, что они сделаны. Раньше я нашел решения Hanson хорошо продуманными, поэтому я поеду с этим.