1

オブジェクトへの参照があります。このオブジェクトには、弱い参照を持つタイマー イベントがあります。例:

timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);

ここで、この参照を削除します (test は参照を含む変数です)。

test = null;

それでも、timerHandler は起動し続けます。これは不可能なので、コードに何らかの間違いがあったに違いありません。他に可能性はありませんか?

それとも、タイマー機能が常に実行されるのを止めることは実際には想定されていませんか?

4

1 に答える 1

3

ガベージ コレクターは継続的に動作するわけではないため、まだ動作していない可能性があります。最後に、ハンドラーの呼び出しを停止する必要があります。そうでない場合は、おそらく別の参照があります。

以下の例を実行すると、null に設定されていて弱い参照があるtimerにもかかわらず、無期限にトレースされていることがわかります。ただし、 (デバッグ プレーヤーを使用して) 行のコメントを解除してガベージ コレクターを強制的に実行すると、ハンドラーは呼び出されません。handlerEventDispatcherSystem.gc()

package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.TimerEvent;
  import flash.system.System;
  import flash.utils.Timer;

  public class TimerTest extends Sprite {
    private var timer:Timer;
    public function TimerTest() {
      var handler:Function = createHandler();
      timer = new Timer(1000);
      timer.addEventListener(TimerEvent.TIMER, handler, false, 0, true);
      timer.start();
      handler = null;
      //System.gc();
    }

    private function createHandler():Function {
      return function(e:Event):void {
        trace('timer');
      };
    }
  }
}

一般に、プログラムの正しい動作のためにガベージ コレクターに頼るべきではありません。

于 2009-08-15T00:39:01.113 に答える