KVO и ARC как удалить сервер

Как удалить наблюдателя из объекта под ARC? Мы просто добавим наблюдателя и забудем о его удалении? Если мы больше не управляем памятью вручную, где мы отказываемся от наблюдения?

например, на контроллере вид:

[self.view addObserver:self
            forKeyPath:@"self.frame"
               options:NSKeyValueObservingOptionNew 
               context:nil];

ранее я бы позвонил removeObserver: в контроллере вида dealloc метод.

3 ответов


вы все еще можете реализовать -dealloc под дугой, которая кажется подходящим местом для удаления наблюдения ключевых значений. Ты просто не звонишь [super dealloc] из этого метода больше нет.

Если вы переопределяли -release раньше вы делали все неправильно.


Я делаю это с помощью этого кода

- (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
}
}    

везде при переполнении стека Крис Хансон советует использовать метод finalize для этой цели и реализовать отдельный метод invalidate, чтобы владельцы могли сообщить объектам, что они сделаны. В прошлом я обнаружил, что решения Хэнсона хорошо продуманы, поэтому я пойду с этим.