观察信息被泄露

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

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不保留A以避免循环。 因此,如果A被解除分配,它必须将自己作为B的观察者移除,否则B将不会引用A曾经的位置(因为它没有保留A)。

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

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

根据addObserver的文档:

 Neither the receiver, nor anObserver, are retained. 

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