首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >观测信息泄露

观测信息泄露
EN

Stack Overflow用户
提问于 2012-02-28 19:37:03
回答 1查看 1.5K关注 0票数 3

我有一个类,我用它作为自己的观察者。当其他对象更改其属性时,我需要它通知我。当它被解除分配时,我不会去移除观察者。不过,我还是会犯这样的错误:

代码语言:javascript
复制
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,然后

代码语言:javascript
复制
[B addObserver:A];  // shortened just to get the point across

,而不是,保留A是为了避免循环。因此,如果A被释放,它必须作为B的观察者移除自己,否则B将不再引用A过去的位置(因为它确实而不是保留了A)。

然而,这一警告似乎意味着,如果我处理B,就会发生一些不好的事情。我唯一能想象的事情是,B对A的弱引用将消失,而A将不再得到任何通知。我不知道“观察信息是怎么泄露的”如果B离开了,为什么它存储的观测信息不消失呢?

EN

回答 1

Stack Overflow用户

发布于 2012-02-28 22:35:47

其实我自己就找到了答案。它似乎是当你释放B,它没有释放观察信息。这是因为KVO是按类别实现的(这不能向对象本身添加额外的数据),所以数据必须由KVO框架集中保存。

根据addObserver的文档:

代码语言:javascript
复制
Neither the receiver, nor anObserver, are retained.

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9488504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档