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

宇宙では、あなたの悲鳴は誰にも聞こえません
。誰も知らないタイマーがあり、タイマーだけが知っているコールバックがあります。つまり、宇宙飛行士 (タイマー) を宇宙船につなぎ、ドライバーを宇宙飛行士につなぐ代わりに、2 人をつなぎ合わせて、タイマーが発火し、コールバックが実行されたかどうか。

あなたがする必要があるのは、タイマーを保持するための何らかの参照を追加することです。そうしないと、コールバックを起動/トリガーする保証がありません。おそらく、そのタイマーを保持する変数を宣言することもできます(クロージャーが作成されたときにそれを渡したいことに注意してください)。辞書を使用することを選択した場合は、弱いキーを使用したくありません。そうしないと、宇宙飛行士を一方の側でドライバーに、もう一方の側でレンチにつなぐだけです。

これは、タイマーを作成したインスタンスを使用しなくなったときに、タイマーを含む変数を null にしてタイマーを停止する必要があることを意味します (匿名関数を使用する場合、イベント リスナーを削除できないため)

これらの機能の詳細については、このブログ投稿をご覧ください。

于 2013-04-23T00:33:24.757 に答える