首页 > 解决方案 > Roku:观察未使用的变量后不观察它们是标准做法吗?

问题描述

假设我正在观察一个变量

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

一段时间后我不再需要了m.someObject。我需要清理并打电话吗

m.someObject.unobserveField("content")

还是我可以离开它?

标签: rokubrightscript

解决方案


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

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

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

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


推荐阅读