87

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

例如,在视图控制器上:

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

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

4

3 回答 3

126

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

如果你以前是压倒一切-release的,那么你做事的方式是错误的。

于 2011-08-05T17:24:50.630 回答
1

我用这段代码做

- (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
}
}    
于 2014-03-25T22:56:59.020 回答
-2

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

于 2011-11-30T15:33:22.020 回答