我有一个对象的引用。这个对象有一个带有弱引用的定时器事件。例子:
timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);
现在我删除了这个引用(test 是包含引用的变量):
test = null;
然而, timerHandler 一直被解雇。这是不可能的,所以我的代码中一定有某种错误,没有任何其他可能性吗?
或者这确实不应该阻止计时器功能一直运行?
我有一个对象的引用。这个对象有一个带有弱引用的定时器事件。例子:
timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);
现在我删除了这个引用(test 是包含引用的变量):
test = null;
然而, 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');
};
}
}
}
通常,您不应依赖垃圾收集器来正确运行程序。