我遇到了内存管理问题,我想知道这是否与我添加和删除事件侦听器的方式有关。假设我在函数中有类似以下内容:
ns = new NetStream();
addEventListener(NetStatusEvent.NET_STATUS,handleStatus);
如果我再次调用它,我用“new”重新创建 ns 的事实是否会删除任何附加到对象的侦听器?
我遇到了内存管理问题,我想知道这是否与我添加和删除事件侦听器的方式有关。假设我在函数中有类似以下内容:
ns = new NetStream();
addEventListener(NetStatusEvent.NET_STATUS,handleStatus);
如果我再次调用它,我用“new”重新创建 ns 的事实是否会删除任何附加到对象的侦听器?
不,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);
弱引用决定了对监听器的引用是强还是弱。强引用(默认)可防止您的侦听器被垃圾收集。弱引用不会。
该语句ns = new NetStream();
可能会或可能不会导致最终删除事件侦听器。如果变量ns
在赋值之前持有对另一个对象的引用,并且这是对该对象的最后一个引用,那么垃圾收集器可能会在某个时候销毁该对象。附加到旧对象的事件侦听器不会影响其销毁。如果一个对象被销毁,它的所有事件侦听器都将被删除,并且如果没有对侦听器的任何剩余引用,则侦听器也可以被销毁(这只适用于内部函数,成员函数永远不会被销毁)。
请注意,垃圾收集器销毁对象可能需要一些时间。因此,即使是未引用的对象也会继续触发事件。这就是为什么如果您完成了一个对象,删除事件侦听器通常是一个好主意。