Apache flex Flex:是否使用";新";删除事件侦听器?
我有一个内存管理问题,我想知道这是否与我如何添加和删除事件侦听器有关。假设函数中有如下内容:Apache flex Flex:是否使用";新";删除事件侦听器?,apache-flex,memory,garbage-collection,Apache Flex,Memory,Garbage Collection,我有一个内存管理问题,我想知道这是否与我如何添加和删除事件侦听器有关。假设函数中有如下内容: ns = new NetStream(); addEventListener(NetStatusEvent.NET_STATUS,handleStatus); 如果我再次调用它,使用“new”重新创建ns是否会删除任何附加到该对象的侦听器?否,new关键字不会将以前的实例标记为垃圾收集,因为附加到ns旧实例的事件侦听器会将该对象保留在内存中 假设你的意思是: ns = new NetStream();
ns = new NetStream();
addEventListener(NetStatusEvent.NET_STATUS,handleStatus);
如果我再次调用它,使用“new”重新创建ns是否会删除任何附加到该对象的侦听器?否,new关键字不会将以前的实例标记为垃圾收集,因为附加到ns旧实例的事件侦听器会将该对象保留在内存中 假设你的意思是:
ns = new NetStream();
ns.addEventListener(NetStatusEvent.NET_STATUS, handleStatus);
ns
的实例现在由事件侦听器本身保留
如果不再需要事件侦听器,请通过调用
removeEventListener(),否则可能导致内存问题。事件
侦听器不会自动从内存中删除,因为
垃圾收集器不会删除侦听器,只要
分派对象存在(除非useWeakReference参数为
设置为true)
理想情况下,在处置对象时删除事件侦听器:
ns.removeEventListener(NetStatusEvent.NET_STATUS, handleStatus);
否则,可以使用弱引用实现事件侦听器:
ns.addEventListener(NetStatusEvent.NET_STATUS, handleStatus, false, 0, true);
弱引用确定对侦听器的引用是强引用还是弱引用。强引用(默认)防止侦听器被垃圾收集。弱引用不可用。语句
ns=new NetStream()代码>可能会或可能不会导致最终删除事件侦听器。如果变量ns
在赋值之前持有对另一个对象的引用,并且这是对该对象的最后一次引用,垃圾收集器可能会在某个时候销毁该对象。附加到旧对象的事件侦听器不会影响其销毁。如果一个对象被销毁,它的所有事件监听器都将被删除,如果没有对监听器的任何剩余引用,监听器也可以被销毁(这只适用于内部函数,成员函数永远不会被销毁)
请注意,垃圾收集器销毁对象可能需要一些时间。因此,即使是未引用的对象也会继续激发事件。这就是为什么在处理完对象后通常最好删除事件侦听器。不,即使对象注册了事件侦听器,也可能会对其进行垃圾收集。例如,见。处置对象不需要删除事件侦听器。依靠标记和清除垃圾收集是次优的。