我有一个类,我用它作为自己的观察者。当其他对象更改其属性时,我需要它通知我。当它被解除分配时,我不会去移除观察者。不过,我还是会犯这样的错误:
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而,而不是,保留A是为了避免循环。因此,如果A被释放,它必须作为B的观察者移除自己,否则B将不再引用A过去的位置(因为它确实而不是保留了A)。
然而,这一警告似乎意味着,如果我处理B,就会发生一些不好的事情。我唯一能想象的事情是,B对A的弱引用将消失,而A将不再得到任何通知。我不知道“观察信息是怎么泄露的”如果B离开了,为什么它存储的观测信息不消失呢?
发布于 2012-02-28 22:35:47
其实我自己就找到了答案。它似乎是当你释放B,它没有释放观察信息。这是因为KVO是按类别实现的(这不能向对象本身添加额外的数据),所以数据必须由KVO框架集中保存。
根据addObserver的文档:
Neither the receiver, nor anObserver, are retained.因此,当您去分配KVO框架时,不知道它必须指向B的指针(它用来计算通知)是无效的。因此,如果另一个对象恰好位于相同的内存空间中,那么它将成为被观察的对象,并可能发送不必要的通知。
https://stackoverflow.com/questions/9488504
复制相似问题