【问题标题】:Action Script: Does setting an object to null, automatically remove all attached event listeners?动作脚本:将对象设置为 null 会自动删除所有附加的事件侦听器吗?
【发布时间】:2011-01-20 15:21:03
【问题描述】:

最近我发现自己经常到处写 removeEventListeners,这让代码变得非常混乱。我知道这是一个最佳实践等,但总的来说它没有任何意义。垃圾收集器应该自己处理这么简单的任务,不是吗?当object设置为null时,自动移除所有监听器有那么难吗?

所以我只想确定是不是这样。将对象设置为 null 会自动删除所有附加的事件侦听器吗?

对此有何见解?

更新: 在我的情况下,情况是这样的 - 我创建一个对象并将一堆事件侦听器附加到它,然后过一段时间我需要重新初始化这个对象。当然,将这个对象设置为 null 比手动解除每个监听器的绑定要容易得多。大多数情况下,侦听器都是匿名函数,这意味着如果不进行代码重构,就不可能。当我简单地用 new 重新初始化一个变量时,我没有得到重复的侦听器等,但我不确定它是以前的值,以及所有侦听器都会被垃圾收集。是吗?

【问题讨论】:

标签: actionscript-3


【解决方案1】:

不,您没有将对象设置为空,而是将指向它的指针设置为空。除非程序的任何其他部分(包括侦听器)不需要它,否则垃圾收集不会拾取它。您需要自己删除所有侦听器,但这不应该阻止您找到一种不那么混乱的方法 - 例如专用的 clearListeners 方法或帮助器类等。

【讨论】:

  • 我经常尝试为我构建的每个类实现一个 IDisposable 接口。这迫使我负责实现简化垃圾收集过程的代码。
  • 通常情况下,我通常要求使用公共 dispose() 方法删除所有侦听器。
【解决方案2】:

我相信您在分配侦听器时需要使用弱引用,并且“nulling”应该足够了。

【讨论】:

  • 这应该可以工作,前提是您清理自己并删除对对象的所有引用。此外,在某些情况下,如果您不对对象进行显式引用,则会被垃圾回收并引入意外行为。
  • 弱引用是addEventListener函数中的一个参数。例如,stage.addEventListener(Event.ENTER_FRAME, loop, false, 0, true);。最后一个参数trueuseWeakReference 参数。我总是将其设置为 true。
  • 弱引用具有误导性!我学到了硬道理,但幸运的是,Juan Pablo Califano 对我之前关于垃圾收集的问题发表了一个非常翔实的解释。请阅读:stackoverflow.com/questions/4200211/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多