Flex:使用“new”删除事件监听器吗?

时间:2013-09-13 19:58:09

标签: flex memory garbage-collection

我遇到了内存管理问题,我想知道它是否与我添加和删除事件监听器的方式有关。假设我在函数中有类似的内容:

ns = new NetStream();
addEventListener(NetStatusEvent.NET_STATUS,handleStatus);

如果我再次调用它,那么我用“new”重新创建ns的事实会删除附加到该对象的所有侦听器吗?

2 个答案:

答案 0 :(得分:2)

不,new关键字不会标记以前的垃圾收集实例,因为附加到旧的ns实例的事件监听器会将对象保留在内存中。

假设你的意思是:

ns = new NetStream();
ns.addEventListener(NetStatusEvent.NET_STATUS, handleStatus);

事件监听器本身保留ns的实例。

ActionScript 3.0 Reference for the Adobe Flash Platform: addEventListener()

  

如果您不再需要事件侦听器,请通过调用将其删除   removeEventListener(),或者可能导致内存问题。事件   监听器不会自动从内存中删除,因为   垃圾收集器只要没有删除监听器   调度对象存在(除非useWeakReference参数是   设置为true)。

理想情况下,在处置对象时删除事件侦听器:

ns.removeEventListener(NetStatusEvent.NET_STATUS, handleStatus);

否则,您可以使用弱引用实现事件侦听器:

ns.addEventListener(NetStatusEvent.NET_STATUS, handleStatus, false, 0, true);

弱引用确定对侦听器的引用是强还是弱。强引用(默认值)可防止您的侦听器被垃圾回收。弱引用不会。

答案 1 :(得分:0)

语句ns = new NetStream();可能会也可能不会导致最终删除事件侦听器。如果变量ns在赋值之前持有对另一个对象的引用,并且这是对该对象的最后一个引用,则垃圾收集器可能在某些时候销毁该对象。附加到旧对象的事件侦听器不会影响其破坏。如果一个对象被销毁,它的所有事件监听器都被删除,如果它们不是对监听器的任何剩余引用,那么监听器也可以被销毁(这只适用于内部函数,成员函数永远不会被销毁)。

请注意,垃圾收集器可能需要一些时间才能销毁对象。所以即使是未引用的对象也会继续发生事件。这就是为什么在完成对象时删除事件侦听器通常是个好主意。