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是经过深思熟虑的,所以我会继续这样做。