本地计时器对象事件处理程序

Bar*_*klı 5 apache-flex flash actionscript-3

我在类函数中有以下代码:

public function foo():void
{
    var timer:Timer = new Timer(10000,1);
    timer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete);
    timer.start();
}

public function onTimerComplete(e:TimerEvent):void
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

上面的代码大部分时间都可以工作,但我担心的是如果计时器被垃圾收集会发生什么?是否有可能onTimerComplete永远不会触发,因为没有其他对计时器的引用?

我知道计时器有一个内部处理程序列表,但不会让它不被GC控制.

bla*_*lah 1

网络上有一些关于运行计时器永远不会被垃圾收集的参考,例如

需要明确的是:即使您没有对计时器的引用,只要计时器正在运行,它就不会被垃圾收集(可以将其视为运行时保留对正在运行的计时器的引用)。

作者:Arno 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>
Run Code Online (Sandbox Code Playgroud)

输出:

精灵
定时器
精灵
定时器
收集垃圾
定时器
定时器