从类中删除所有观察者

时间:2015-12-17 10:57:37

标签: ios objective-c cocoa key-value-observing

在一个项目中,我有一个班级说" A",还有许多其他班级正在观察班级" A"的属性值。

有时课程" A"实例被取消分配并观察失败导致崩溃!

有没有办法从课堂上删除所有观察者" A"?像这样:

-(void) dealloc{
    [remove allObservers forKey:@"theKey"];
}

2 个答案:

答案 0 :(得分:2)

总之,遗憾的是没有。不幸的是,KVO是it gets you in the end

我之前一直在努力解决这个问题,我找到了以下两个解决方案:

  1. 使用代理方法在您的观察者中注册观察,这将保留观察者的弱引用列表。
    理想情况下,您还需要一种代理方法来删除观察者,以便相应地更新您的列表(尽管由于它们是列表中的弱引用,如果某些观察者使用标准删除自身,则不会受到伤害KVO而不是你的代理方法,然后deallocd本身。) 如果您的观察者被解除分配,它应该通知所有观察者(使用协议),或者直接将其删除。对于最后一个,使用异常也可以派上用场(我意识到在Obj-C中异常是邪恶的,但该做什么):

    @try 
    {
        [self removeObserver:observee forKeyPath:@"path"];
    }
    @catch (NSException * __unused exception) {}
    
  2. 使用KVO的一些抽象。我想到了一些项目,例如RZDataBindingMAKVONotificationCenter(尽管它的名称,它实际上与KVO有关)

答案 1 :(得分:0)

你应该让“A”类保持活着,直到有其他对象观察它的属性值。也许它会被解除分配,因为你没有正确处理它的引用。

您应该检查“A”是否需要“强”参考。当你不再需要“A”时(即:你正在弹出一个视图控制器,你正在刷新一个表,你正在清除一个滚动视图),你还应该删除任何附加到它的观察者(并且能够做到)它)。