2011-12-05 9 views
1

呼び出されるたびに新しいタイマーを作成する関数では、これを処分する正しい方法ですか?GCでタイマーを利用できますか?

private var _timers:Vector.<Timer> = new Vector.<Timer>; 
private var _timer:Timer 

private function timer():void 
{ 
    _timer = new Timer(10000, 1); 
    _timers.push(_timer); 
    _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimer, false,0,true); 
    _timer.start(); 
} 

private function onTimer(e:TimerEvent):void 
{ 
    e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimer); 
    _timers[0] = null; 
    _timers.shift(); 
} 

答えて

1

たぶん、あなたは、遅延コールを処理

_timers[0].stop(); 
+0

私はこの1つの真の答えだと思います。私は、タイマーがまだ実行されている場合、それはどこかに内部参照を持っていると思います。 1行の_timers [0] = nullは不要です。なぜなら、あなたはそれをシフトアウトしているからです。 – ansiart

+0

彼はランニングカウントを '1'に設定しています。つまり、' 'stop()'を呼び出す必要はありません。すべての参照を削除するだけでGCが残りの部分を処理します – xLite

1

私が作った機能 "遅延" を追加することができます。私はディレイコールをたくさん使っている私のゲームのために作ったので、効率的にディレイを処理する方法を見つけなければなりませんでした。それでもまだAS3の達人がもっと効率的な方法を見つけているかもしれませんが、もしあれば教えてください。

public static var timer_stack:Vector.<Timer> = new Vector.<Timer>(); 

public static function delay(delaytime:Number, func_name:Function, repeat:Number = 1) 
{ 
    var timer:Timer = new Timer(delaytime, repeat); 
    timer_stack.push(timer);  
    timer_stack[timer_stack.length-1].addEventListener(TimerEvent.TIMER, func_name ,false,0,true); 
    timer_stack[timer_stack.length-1].addEventListener(TimerEvent.TIMER_COMPLETE, 
        function(e:TimerEvent){ delay_complete(e, func_name); }); 
    timer_stack[timer_stack.length-1].start(); 
} 

public static function delay_complete(e, func_name:Functio):void 
{ 
    e.target.stop(); 
    e.target.removeEventListener(TimerEvent.TIMER, func_name); 
    timer_stack[timer_stack.length-1].removeEventListener(TimerEvent.TIMER_COMPLETE, 
        function(){ func_name_complete(e, func_name);}); 

    for(var i=0; i < timer_stack.length; i++) 
    { 
     if(timer_stack[i].running == true) 
      trace("timer @ "+i+" is running"); 

     if(timer_stack[i].running == false) 
     { 
      timer_stack[i] = null; 
      timer_stack.splice(i,1); 
      trace("remove timer @ "+i); 
     } 
    } 
} 
1

ちょうどあなたの時間が何らかの理由で変更する場合には、その代わりにTimerオブジェクトが0指標であると仮定するとの直接のオブジェクトに対処するのが最善です。 onTimer()に必要

ほんの少しの調整は:

private function onTimer(e:TimerEvent):void 
{ 
    var timer:Timer = e.currentTarget as Timer; 

    timer.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimer); 
    _timers.splice(_timers.indexOf(timer), 1); 
} 

あなたはnullにインデックスを設定する必要はありません、それは決して常に、指定されたインデックスになりますあなたの項目を想定することを確認することをお勧めしません。この場合、Arrayオブジェクト(_timers)で利用可能なindexOf()メソッドを使用して確認してください。

希望します。

関連する問題