使计时器可用于GC?

时间:2011-12-05 15:57:21

标签: actionscript-3 timer garbage-collection

在每次调用时都会创建一个新计时器的函数中,这是处理它的正确方法吗?

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();
}

3 个答案:

答案 0 :(得分:1)

也许你可以添加一个

_timers[0].stop();

答案 1 :(得分: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);
        }
    }
}

答案 2 :(得分: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,并且假设您的商品将位于指定的索引,这绝不是一个好习惯,请务必确保。在这种情况下,请确保使用indexOf()类型对象(_ timers)中提供的Array方法。

希望它有所帮助。