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控制.
网络上有一些关于运行计时器永远不会被垃圾收集的参考,例如:
需要明确的是:即使您没有对计时器的引用,只要计时器正在运行,它就不会被垃圾收集(可以将其视为运行时保留对正在运行的计时器的引用)。
作者: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)
输出:
精灵
定时器
精灵
定时器
收集垃圾
定时器
定时器
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |