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, чтобы владельцы могли сообщить объектам, что они сделаны. В прошлом я обнаружил, что решения Хэнсона хорошо продуманы, поэтому я пойду с этим.