gpt4 book ai didi

cocoa - 在 Cocoa 中,在释放对象时,我是否需要从接收 KVO 通知中删除该对象?

转载 作者:行者123 更新时间:2023-12-03 16:01:29 25 4
gpt4 key购买 nike

当我注册一个对象 foo 来接收来自另一个对象 bar 的 KVO 通知时(使用 addObserver:...),如果我随后释放 foo 我需要向 -dealloc 中的 bar 发送 removeObserver:forKeyPath: 消息吗?

最佳答案

您需要在 -[NSObject dealloc] 运行之前使用 -removeObserver:forKeyPath: 删除观察者,所以是的,在 -dealloc 中执行此操作 你的类的方法可以工作。

比这更好的是有一个确定性点,无论拥有正在观察的对象,都可以告诉它它已经完成并且将(最终)被释放。这样,当不再需要进行观察的事物时,您可以立即停止观察,无论它何时实际被释放。

记住这一点很重要,因为 Cocoa 中对象的生命周期并不像某些人想象的那样具有确定性。各种 Mac OS X 框架本身发送您的对象 -retain-autorelease,延长它们的生命周期,超出您可能想象的范围.

此外,当您过渡到 Objective-C 垃圾回收时,您会发现 -finalize-dealloc 相比,将在非常不同的时间和非常不同的上下文中运行 做到了。一方面,终结是在不同的线程上进行的,因此您确实无法安全地将 -removeObserver:forKeyPath: 发送到 -finalize< 中的另一个对象 方法。

坚持在 -dealloc-finalize 中进行内存(和其他稀缺资源)管理,并使用单独的 -invalidate 方法来实现所有者在某个确定点告诉对象您已完成对它的处理;做诸如删除 KVO 观察之类的事情。您的代码的意图将更加清晰,并且需要处理的细微错误也会更少。

关于cocoa - 在 Cocoa 中,在释放对象时,我是否需要从接收 KVO 通知中删除该对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com