0

大家晚上好

我通常不需要问,因为有很多信息,但我找不到 - 至少,不是具体的。

这里的要点是:我在一个函数中声明一个对象,然后在该对象中添加一个监听器。问题:一旦函数运行,对象和函数都会被丢弃吗?出于显而易见的原因,我不希望没有物体的随机听众。

如果有帮助,这里是简化的代码:

(随意让它看起来更像样,对此表示歉意)

public function textSfx(chPos:int, otlPos:int):void {

        var sfxTimer:Timer = new Timer (300, 6);


            sfxTimer.addEventListener(TimerEvent.TIMER, textSfxHandler(chPos));


        sfxTimer.start();
    }

    public function textSfxHandler(chPos:int):Function
    {
        return function(evt:TimerEvent):void
        {
            trace("char being affected is: " + chPos);
        }
    }

它工作得非常好,但我担心听众无家可归。肯定不是这样的,对吧?正确的??

PS 由于多个元素需要同时使用计时器,因此该对象在函数内部声明,这不适用于单个外部声明的计时器。

4

2 回答 2

0

Timer 对象和匿名函数将保留在内存中,直到 Timer 链接到事件侦听器。你的代码不会让 GC 完成它的工作。

添加监听器时可以使用弱引用参数(第 5 个参数):

sfxTimer.addEventListener(TimerEvent.TIMER, textSfxHandler(chPos), false,0,true);

但无论如何使用匿名函数都是一种不好的做法

以下代码在您的情况下会很好吗?请注意,我使用命名侦听器,而不是每次都重新创建它们:

    private var timerPool:Dictionary = new Dictionary();
    public function textSfx(chPos:int, otlPos:int=0):void {
        var sfxTimer:Timer = new Timer (300, 6);
        timerPool[sfxTimer] = chPos;
        sfxTimer.addEventListener(TimerEvent.TIMER, textSfxHandler);
        sfxTimer.addEventListener(TimerEvent.TIMER_COMPLETE, textSfxComplete);
        sfxTimer.start();

    }
    public function textSfxHandler(e:TimerEvent):void
    {
        var sfxTimer:Timer = e.target as Timer;
        trace("char being affected is" + timerPool[sfxTimer]);
    }
    public function textSfxComplete(e:TimerEvent):void {
        var sfxTimer:Timer = e.target as Timer;
        sfxTimer.removeEventListener(TimerEvent.TIMER, textSfxHandler);
        sfxTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, textSfxComplete);
        delete timerPool[sfxTimer];
    }
于 2013-04-22T22:28:34.450 回答
0

在太空中,没有人能听到你的尖叫声
这就是你在这里所拥有的。你有一个没人知道的 Timer,你有一个只有 Timer 知道的回调。因此,与其把你的宇航员(定时器)拴在你的宇宙飞船上,把你的螺丝刀拴在他身上,你把它们两个拴在一起,让它们飘到垃圾收集器随时可以捡起它们的地方,不管定时器是否已经开火并且回调是否运行。

您需要做的是添加某种引用以保留您的计时器,否则您无法保证它会触发/触发回调。您可能也可以声明一个变量来保存该计时器(请注意,您需要在创建闭包时将其传入)。如果您选择使用字典,则不想使用弱键,否则您只是将宇航员拴在一侧的螺丝刀和另一侧的扳手上。

这意味着当您不再使用创建计时器的实例时,您确实需要将包含计时器的变量设为空并停止计时器(因为如果您使用匿名函数,则无法删除事件侦听器)。

有关这些事情如何工作的更多信息,请查看此博客文章

于 2013-04-23T00:33:24.757 回答