网上有一些关于运行计时器永远不会被垃圾收集的参考,e.g. http://osflash.org/pipermail/osflash_osflash.org/2008-February/014893.html:
需要明确的是:即使您没有引用计时器,只要
当计时器运行时,它不会被垃圾收集(想想
就好像运行时保留了对正在运行的计时器的引用)。
作者:Adobe AIR 团队的 Arno Gourdol
但我一直没能找到权威的来源。
可能最好不要依赖这种特殊行为,而是使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>
Output:
sprite
timer
sprite
timer
收集垃圾
timer
timer