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