2

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

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

如果我再次调用它,我用“new”重新创建 ns 的事实是否会删除任何附加到对象的侦听器?

4

2 回答 2

2

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

假设你的意思是:

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

的实例ns现在由事件侦听器本身保留。

Adobe Flash 平台的 ActionScript 3.0 参考:addEventListener()

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

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

ns.removeEventListener(NetStatusEvent.NET_STATUS, handleStatus);

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

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

弱引用决定了对监听器的引用是强还是弱。强引用(默认)可防止您的侦听器被垃圾收集。弱引用不会。

于 2013-09-13T20:20:40.523 回答
0

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

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

于 2013-09-14T02:16:47.207 回答