flash – 本地计时器对象事件处理程序
我在类函数中有以下代码:
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 } 上面的代码大部分时间都可以工作,但我担心的是如果计时器被垃圾收集会发生什么?是否有可能onTimerComplete永远不会触发,因为没有其他对计时器的引用? 我知道计时器有一个内部处理程序列表,但不会让它不被GC控制. 解决方法
在网上有一些参考文献,运行计时器永远不会被垃圾收集,e.g.:
但我无法找到权威来源. 可能最好不要依赖这种特殊行为,而是将计时器作为类级变量. 建议事件侦听器保持计时器不被垃圾回收的答案是不正确的.引用是从定时器到侦听器函数(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,true); var sprite:Sprite = new Sprite(); sprite.addEventListener(Event.ENTER_FRAME,onSprite,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> 输出:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |