KVO и ARC как удалить Observer - PullRequest
       22

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

87 голосов
/ 05 августа 2011

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

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

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

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

Ответы [ 3 ]

126 голосов
/ 05 августа 2011

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

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

0 голосов
/ 26 марта 2014

Я делаю это с этим кодом

- (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
}
}    
0 голосов
/ 30 ноября 2011

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

...