有在网络上运行的计时器绝不被垃圾收集,e.g.一些参考:
只是要清楚:即使你有一个计时器的引用,只要 作为定时器运行,它不会被垃圾收集(想想 它就好像运行时保持对运行定时器的引用)。
由阿诺Gourdol在Adobe AIR团队
,但我一直没能找到一个权威来源。
尽管如此,最好不要依赖这种特殊行为,而应该使timer
成为一个类级变量。
解决方案建议事件监听器保持计时器不被垃圾回收不正确。引用是从定时器到侦听器函数(onTimerComplete
),所以如果定时器可到达,那么侦听器函数将不会被垃圾收集,但反之亦然。这很容易测试:
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="application1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
private var _gcTimer:Timer;
protected function application1_creationCompleteHandler(event:FlexEvent):void {
var timer:Timer = new Timer(30, 4);
timer.addEventListener(TimerEvent.TIMER, onTimer, false, 0, true);
var sprite:Sprite = new Sprite();
sprite.addEventListener(Event.ENTER_FRAME, onSprite, false, 0, true);
_gcTimer = new Timer(59, 1);
_gcTimer.addEventListener(TimerEvent.TIMER, garbageCollect);
timer.start();
_gcTimer.start();
}
private function onTimer(event:TimerEvent):void {
trace("timer");
}
private function onSprite(event:Event):void {
trace("sprite");
}
]]>
</fx:Script>
</s:Application>
输出:
精灵
计时器
精灵
计时器
收集垃圾
计时器
计时器
我的共同ncern是如果计时器的延迟时间过长,可以说数千秒有计时器被垃圾收集的可能性,并且onTimerComplete永远不会被调用。 – 2011-05-05 00:58:49
它不应该被GCed直到事件监听器被删除。 – 2011-05-05 01:05:44
你确定吗?这篇文章:http://gingerbinger.com/2010/07/actionscript-3-0-events-the-myth-of-useweakreference/指出,听众不会让调度员不被GC检查。 – 2011-05-05 01:07:14