说我正在观察一个变量
m.someObject.observeField("content", "onContentChanged")
一段时间后,我不再需要m.someObject
。
我需要清理并致电
m.someObject.unobserveField("content")
还是我可以离开它?
答案 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可以显着提高性能。