Roku:在观察未使用的变量之后,不观察它们是否是标准做法?

时间:2018-09-13 21:33:35

标签: roku brightscript

说我正在观察一个变量

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

一段时间后,我不再需要m.someObject。 我需要清理并致电

m.someObject.unobserveField("content")

还是我可以离开它?

2 个答案:

答案 0 :(得分:1)

是的,请尝试遵循此惯例,就像处理open()之后的文件最终应调用close()一样(即使通常说来,超出范围会关闭连接,明确照顾它是一个好习惯)。

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

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

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

答案 1 :(得分:0)

是的,你应该。 Roku没有世界上最大的垃圾收集器,并且我们注意到,Roku可以显着提高性能。