gpt4 book ai didi

Roku:在观察未使用的变量后取消观察它们是标准做法吗?

转载 作者:行者123 更新时间:2023-12-01 04:32:40 25 4
gpt4 key购买 nike

假设我正在观察一个变量

m.someObject.observeField("content", "onContentChanged")

一段时间后我不再需要m.someObject。我需要清理和调用吗

m.someObject.unobserveField("内容")

还是我可以离开它?

最佳答案

是的,尝试将此作为一种好的做法,就像在 open() 之后处理文件最终应该调用 close() 一样(即使,一般来说超出范围会关闭连接,明确处理它是一个好习惯)。

现在,请注意 node.unobserveField("X") 是一个“核心”选项,因为它会丢弃 任何和所有 放置在 node.X 上的观察者使用 node.observeField("X", ...),无论它们来自哪个组件或线程。因此,如果每个字段有多个观察者,您可能会后悔并最终完全避免使用 unobserveField()。请注意,当 node 被销毁时,这些观察者将得到处理(即不是内存泄漏)。

现在,还有一个在许多情况下更好的更新的 API - 这些方法的“...Scoped()”版本。在该版本中,node.unobserveFieldScoped("X") 更具选择性 - 它仅删除由 当前组件 放置的 node.X 上的观察者;其他组件设置的观察者保持活跃。

对我来说,通过考虑存储观察者链接的位置,更容易区分这两种方法。在非范围版本中,所有链接都与观察对象一起存储 - 因此析构函数负责清理链接。在范围版本中,链接与每个观察组件一起存储 - 因此 Unobserve 仅在本地对这些组件起作用。所以我相信有一个警告 - 如果 observED 对象被销毁,它将(暂时)在 observING 对象中留下一些挂起的 scoped 链接。相反,如果使用了非作用域的 ObserveField(),则 observING 对象的销毁将在 observED 对象中留下未清理的链接(当它被删除时将被清理)。

关于Roku:在观察未使用的变量后取消观察它们是标准做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52322097/

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