有在網絡上運行的計時器絕不被垃圾收集,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