观察信息被泄露

时间:2012-02-28 19:37:03

标签: ios key-value-observing

我有一个班级,我正在使用它作为自己的观察者。当其他对象更改其属性时,我需要它通知我。当它被解除分配时,我不打算删除观察者。但是我得到像这样的错误:

An instance 0xf819680 of class **** was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:

现在,我真的不明白为什么这会成为一个问题。我对KVO的理解是,如果对象A想要观察对象B,那么A保留B然后

[B addObserver:A];  // shortened just to get the point across

和B NOT 保留A以避免循环。因此,如果A被解除分配,它必须将自己作为B的观察者移除,否则B将不会引用A曾经的位置(因为它确实 NOT 保留A)。

然而,这个警告似乎意味着如果我解除B的坏事就会发生。我能想象到的唯一一件事就是B对A的弱引用会消失,A就不会再收到通知了。我不知道“观察信息是如何泄露的”。如果B消失了,为什么它存储的观察信息不会消失?

1 个答案:

答案 0 :(得分:3)

其实我自己也找到了答案。似乎当你解除分配B时,它不会释放观察信息。这是因为KVO是通过类别(不能向对象本身添加额外数据)实现的,因此数据必须由KVO框架集中保存在某处。

根据addObserver的文档:

Neither the receiver, nor anObserver, are retained.

因此,当您释放KVO框架时,它不知道它对B(它用于计算通知)的指针是无效的。因此,如果另一个对象恰好位于相同的内存空间中,那么它将成为观察对象并可能发送不需要的通知。