roku - Roku:观察未使用的变量后不观察它们是标准做法吗?
问题描述
假设我正在观察一个变量
m.someObject.observeField("content", "onContentChanged")
一段时间后我不再需要了m.someObject
。我需要清理并打电话吗
m.someObject.unobserveField("content")
还是我可以离开它?
解决方案
是的,尝试将此作为一种良好做法,就像在open()
最终调用后处理文件时一样close()
(即使一般来说,超出范围会处理关闭连接,明确处理它是一种很好的做法)。
现在,请注意这node.unobserveField("X")
是一个“核”选项,因为它会丢弃node.X 上放置的所有node.observeField("X", ...)
观察者,无论它们来自哪个组件或线程。因此,如果每个字段有多个观察者,您最终可能会后悔并最终完全避免使用 unobserveField()。请注意,当node
被销毁时,这些观察者将被处理(即不是内存泄漏)。
现在,还有一个在许多情况下更好的更新 API - 这些方法的“...Scoped()”版本。在那个版本中,node.unobserveFieldScoped("X")
它更具选择性——它只删除 node.X 上由当前组件放置的观察者;其他组件设置的观察者保持活动状态。
对我来说,通过考虑观察者链接存储在哪里更容易区分这两种方法。在非作用域版本中,所有链接都与观察对象一起存储 - 因此析构函数负责清理链接。在作用域版本中,链接与每个观察组件一起存储 - 因此 Unobserve 仅在本地对这些组件起作用。所以我相信有一个警告 - 如果观察到的对象被破坏,它将(暂时)在观察对象中留下一些悬挂的范围链接。相反,如果使用了非作用域的 ObserveField(),则 observING 对象的销毁将在 observED 对象中留下未清理的链接(当它被丢弃时将被清理)。
推荐阅读
- frontend - 搜索工具:自动定义自己、保存响应并重新发送它们的代理服务器
- instagram - 如何在 wordpress 网站上集成订阅 instagram 按钮
- python - 用于在 Python 中调整实例属性的 EXP 系统(基于文本的 RPG)
- ssas - SSAS多维模式教程第4课,使用NamingTemplate
- python - 模块“X”没有属性“Y”,有时会出现,有时不会
- docker - Rancher 2.5.5 无法启动集群控制器 c-dbk7g:上下文已取消
- android - 如何将数据从 DialogFragment 传递到 android / Kotlin 中的片段
- flutter - 未找到目标文件“lib\main.dart”。扑
- html - 如何使文本长度调整为页面宽度?
- javascript - 为什么即使我已登录,我也无法访问仪表板路线?