Actionscript 3:自我事件监听器是否阻止对象被垃圾收集?

时间:2012-04-24 00:43:26

标签: actionscript-3 garbage-collection event-listener

我知道事件侦听器和对象的引用会阻止垃圾收集器处理对象。我的问题是,一个事件监听器会放在一个对象上,监听同一个对象,阻止该对象被垃圾收集吗?

我问,因为这似乎发生在我身上。我打破了我对一个对象的所有引用,但是当它的计时器熄灭时我仍然看到了痕迹。同时,似乎这不应该阻止集合,因为它会创建已分配但不可引用的内存。

2 个答案:

答案 0 :(得分:4)

不,但是。

AVM2垃圾收集器假定以查找无法访问的对象。但是因为垃圾收集是非确定性的,所以很难依赖甚至测试这种行为 - 它可能是垃圾收集器工作得很好,但是由于你有足够的RAM可用而不需要运行标记和扫描

当你完成对象时,移除事件监听器是个好主意,即使它们来自对象本身(即循环引用)。为什么这是个好主意?因为你永远不知道垃圾收集器何时运行。如果您想要确定性行为,请始终以确定性方式删除侦听器,尤其以获取TIMER和ENTER_FRAME等时间敏感事件,否则您将在运行的侦听器和运行的垃圾收集器之间创建竞争条件。垃圾收集器只能定期运行。

通常,如果要在不创建对象的其他引用的情况下附加事件侦听器,请将true传递给useWeakReference的{​​{1}}参数。但是,如果您想立即停止接收事件,则在完成对象后,您仍需要手动分离事件侦听器。

答案 1 :(得分:0)

是的,这将阻止GC清理对象。试图阻止这种情况的一种黑客方法是在添加侦听器时使用弱引用。

 myobj.addEventListener(Event.EVENT, eventHandler, false, 0, true);

最后一个true标志将设置侦听器使用弱对象引用。

最佳做法是在归零对象之前保持跟踪并始终删除所有活动的侦听器。

查看这篇精彩的博文,了解有关此主题的更多信息

http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html