Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flex:是否使用";新";删除事件侦听器?_Apache Flex_Memory_Garbage Collection - Fatal编程技术网

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
在赋值之前持有对另一个对象的引用,并且这是对该对象的最后一次引用,垃圾收集器可能会在某个时候销毁该对象。附加到旧对象的事件侦听器不会影响其销毁。如果一个对象被销毁,它的所有事件监听器都将被删除,如果没有对监听器的任何剩余引用,监听器也可以被销毁(这只适用于内部函数,成员函数永远不会被销毁)


请注意,垃圾收集器销毁对象可能需要一些时间。因此,即使是未引用的对象也会继续激发事件。这就是为什么在处理完对象后通常最好删除事件侦听器。

不,即使对象注册了事件侦听器,也可能会对其进行垃圾收集。例如,见。处置对象不需要删除事件侦听器。依靠标记和清除垃圾收集是次优的。