2009-08-15 11 views
1

オブジェクトへの参照があります。このオブジェクトには弱い参照を持つタイマーイベントがあります。例:ガーベジコレクションと弱い参照のイベントが混乱していました。3

test = null; 

そして、まだ、timerHandlerが解雇され続ける:

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

は、今私は(テストが参照を含む変数である)、この参照を削除します。これは不可能なので、他の可能性なしに私のコードでいくつかの間違いを犯さなければなりませんか?

これは実際には、タイマ機能が常に実行されるのを止めないと思われますか?

+0

ここに来る人は、[これはすばらしい記事です](http://liveweb.archive.org/http://gingerbinger.com/2010/07/actionscript-3-0-events-the-myth -of-useweakreference /)を参照してください。 – Russ

+0

@Russ正しいリンクは次のようです:http://gingerbinger.com/2010/07/actionscript-3-0-events-the-myth-of-useweakreference/ –

答えて

3

ガベージコレクタは継続的に動作しないため、まだ実行されていない可能性があります。最終的には、ハンドラが呼び出されなくなります。もしそうでなければ、おそらく別の言及があります。

handlerがヌルに設定され、EventDispatcherに弱い参照があっても、以下の例を実行すると、timerが無期限にトレースされます。ただし、デバッグプレーヤを使用してSystem.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'); 
     }; 
    } 
    } 
} 

通常、プログラムの正しい操作にガベージコレクタを使用しないでください。

+0

ありがとうございました。手動でSystem.gc()メソッドを使用してガベージコレクタを呼び出す方法をお勧めしますか? – Tom

+3

ちょっとトム、いいえ、あなたはそれをしてはいけません(実際にはデバッグプレーヤーのみの機能です)。ガベージコレクタは、事前に実行するために間隔を置いて実行されます(これは高価な処理です)。タイムイベントを終了した場合は、タイマーを停止してイベントリスナーを削除することで、適切にクリーンアップする必要があります。 –

関連する問題