Actionscript 3 对actionscript 3中的垃圾收集和弱引用事件感到困惑
我引用了一个对象。此对象具有弱引用的计时器事件。例如:Actionscript 3 对actionscript 3中的垃圾收集和弱引用事件感到困惑,actionscript-3,garbage-collection,weak-references,Actionscript 3,Garbage Collection,Weak References,我引用了一个对象。此对象具有弱引用的计时器事件。例如: timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true); 现在我删除此引用(test是包含该引用的变量): 然而,timerHandler一直被解雇。这是不可能的,所以我的代码中一定有某种错误,没有任何其他可能性吗 或者这真的不应该阻止计时器功能一直运行吗?垃圾收集器没有持续运行,所以很可能它还没有运行。当它最终执行时,您的处理程序应该停止被调用。如果没
timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);
现在我删除此引用(test是包含该引用的变量):
然而,timerHandler一直被解雇。这是不可能的,所以我的代码中一定有某种错误,没有任何其他可能性吗
或者这真的不应该阻止计时器功能一直运行吗?垃圾收集器没有持续运行,所以很可能它还没有运行。当它最终执行时,您的处理程序应该停止被调用。如果没有,可能还有另一个参考 当我运行下面的示例时,我看到无限期跟踪
timer
,即使handler
已设置为null并且EventDispatcher
具有弱引用。但是,如果我通过取消注释System.gc()
行(使用调试播放器)强制垃圾收集器运行,则永远不会调用处理程序
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.system.System;
import flash.utils.Timer;
public class TimerTest extends Sprite {
private var timer:Timer;
public function TimerTest() {
var handler:Function = createHandler();
timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER, handler, false, 0, true);
timer.start();
handler = null;
//System.gc();
}
private function createHandler():Function {
return function(e:Event):void {
trace('timer');
};
}
}
}
一般来说,程序的正确运行不应该依赖垃圾收集器。谢谢。您建议使用System.gc()方法手动调用垃圾收集器吗?嘿,Tom,不,您不应该这样做(它实际上是一个只支持调试播放器的功能)。由于性能原因,垃圾收集器每隔一段时间运行一次(这是一个昂贵的过程)。如果您处理完时间事件,您应该通过停止计时器并删除事件侦听器来正确地清理它们。对于在此登录的任何人,在弱引用上。@Russ正确的链接似乎是:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.system.System;
import flash.utils.Timer;
public class TimerTest extends Sprite {
private var timer:Timer;
public function TimerTest() {
var handler:Function = createHandler();
timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER, handler, false, 0, true);
timer.start();
handler = null;
//System.gc();
}
private function createHandler():Function {
return function(e:Event):void {
trace('timer');
};
}
}
}