在一个项目中,我有一个班级说" A",还有许多其他班级正在观察班级" A"的属性值。
有时课程" A"实例被取消分配并观察失败导致崩溃!
有没有办法从课堂上删除所有观察者" A"?像这样:
-(void) dealloc{
[remove allObservers forKey:@"theKey"];
}
答案 0 :(得分:2)
总之,遗憾的是没有。不幸的是,KVO是it gets you in the end。
我之前一直在努力解决这个问题,我找到了以下两个解决方案:
使用代理方法在您的观察者中注册观察,这将保留观察者的弱引用列表。
理想情况下,您还需要一种代理方法来删除观察者,以便相应地更新您的列表(尽管由于它们是列表中的弱引用,如果某些观察者使用标准删除自身,则不会受到伤害KVO而不是你的代理方法,然后deallocd本身。)
如果您的观察者被解除分配,它应该通知所有观察者(使用协议),或者直接将其删除。对于最后一个,使用异常也可以派上用场(我意识到在Obj-C中异常是邪恶的,但该做什么):
@try
{
[self removeObserver:observee forKeyPath:@"path"];
}
@catch (NSException * __unused exception) {}
使用KVO的一些抽象。我想到了一些项目,例如RZDataBinding和MAKVONotificationCenter(尽管它的名称,它实际上与KVO有关)
答案 1 :(得分:0)
你应该让“A”类保持活着,直到有其他对象观察它的属性值。也许它会被解除分配,因为你没有正确处理它的引用。
您应该检查“A”是否需要“强”参考。当你不再需要“A”时(即:你正在弹出一个视图控制器,你正在刷新一个表,你正在清除一个滚动视图),你还应该删除任何附加到它的观察者(并且能够做到)它)。