3

Flash がガベージ コレクションを行う方法に関するこの非常に優れた記事を読みました: http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

しかし、CPU を集中的に使用するマーク アンド スイープ方式ではなく、より高速な参照カウント方式によってすべてのオブジェクトが確実にガベージ コレクションされるようにするには、どうすればよいのだろうかと考えていました。次の関数があり、それを使用してオブジェクトを作成するとします。

function makeIt():void {
    var spriteA:Sprite = new Sprite();
    var spriteB:Sprite = new Sprite();
    spriteB.addEventListener(MouseEvent.CLICK, myCallback);
    var spriteC:Sprite = new Sprite();
    spriteA.addChild(spriteB);
    spriteB.addChild(spriteC);
    stage.addChild(spriteA);
}

次のことを行った場合、マーク アンド スイープによる GC のみの対象となりますか?

spriteB.removeEventListener(MouseEvent.CLICK, myCallback);
stage.removeChild(SpriteA);

親には子供への参照があり、子供には親への参照があります。参照カウントによって GC の対象とするには、これをすべて行う必要がありますか?

spriteB.removeChild(spriteC);
spriteB.removeEventListener(MouseEvent.CLICK, myCallback);
spriteA.removeChild(spriteB);
stage.removeChild(spriteA);
spriteA = null;

spriteB と spriteC も null に設定する必要がありますか? そして、spriteC が Sprite を拡張し、いくつかの独自のプロパティを持つクラスのインスタンスであるとしたらどうなるでしょうか。それらも無効にする必要がありますか?

4

1 に答える 1

0

はい、参照カウントをゼロにするには、removeChild、removeEventListener、およびローカル参照 (またはクラス レベル参照) を設定する必要があります。

于 2014-01-09T15:34:54.003 に答える