KVO и ARC как удалитьObserver

Как удалить наблюдателя из объекта в 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 хорошо продуманными, поэтому я поеду с этим.