我有一堂课,我用它作为自身的观察者。当其他对象更改其属性时,我需要它通知我。当它被释放时,我懒得删除观察者。但是我收到这样的错误:
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 消失了,为什么它存储的观察信息不会消失?
其实这个问题我自己也找到了答案。似乎当您释放 B 时,它并没有释放观察信息。这是因为 KVO 是按类别实现的(不能向对象本身添加额外的数据),因此数据必须由 KVO 框架集中保存在某个地方。
根据 addObserver 的文档:
Neither the receiver, nor anObserver, are retained.
因此,当您解除分配时,KVO 框架不知道它指向 B 的指针(它用于计算通知)是无效的。因此,如果另一个对象恰好位于同一内存空间中,那么它将成为观察对象并可能发送不需要的通知。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)