KVO和ARC如何删除Observer

如何从ARC下的对象中移除观察者? 我们只是添加观察者而忘记删除它? 如果我们不再手动pipe理内存,那么我们在哪里放弃观察?

例如,在视图控制器上:

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

以前,我会在视图控制器的dealloc方法中调用removeObserver:

您仍然可以在ARC下实现-dealloc ,这似乎是删除关键值观察的适当位置。 你只是不要再从这个方法中调用[super dealloc]了。

如果你以前压倒性的,你做错了事情。

我用这个代码来做

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

在堆栈溢出的其他地方 ,Chris Hansonbuild议使用finalize方法来实现这个目的,并实现一个单独的invalidate方法,这样所有者就可以告诉对象他们已经完成了。 在过去,我发现汉森的解决scheme是经过深思熟虑的,所以我会继续这样做。