2011-07-26 4 views
1

このラインremoveChildは、Flash Playerのメモリからムービークリップを完全に削除するのに十分ですか?

clip.removeChild(clip.getChildAt(0)); 

は完全に 0インデックスでクリップの子を削除しますか?私はあなたがそのクリップへのすべての参照にnullに設定する必要がどこかを読んだが、私のコードで他の参照がありません。 0のクリップは通常のaddChild()で追加されました。

答えて

1

:オブジェクトは、あなたがコントロールすることはできません、コレクションの一部である場合

-not have any other reference to the object throughout your code 
-the object shouldn't be part of any collection (like Array or Vector) 
-the current reference should be set to null 

は、最も一般的な状況第二の条件に特別な注意を払うようにしてくださいリスナーが接続されているときと表示リストの一部があるときが直接です。その上に、オブジェクトがあなたがコントロールできるコレクションの一部である他の状況がありますが、それをそこから削除することも忘れないでください。あなたのオブジェクトをスワイプするガベージコレクタを強制することも

、(唯一のテストではなく、生産のために)、あなたはSystem.gc()を使用することができ、その後、System.privateMemory

+0

パーフェクト、ありがとう。 –

0

まだクリップに参照がある場合は、ガベージコレクタがオブジェクトを破棄し、イベントリスナを削除してクリップ参照を強制的にヌルにする可能性があります。

+0

でメモリをチェックし、私は何も言及がありませんと思います。クリップはループ内でオンザフライで作成されます。 –

0

参照がなく、リスナーも他のハンドルもない場合は、最終的にガベージコレクションされます。 GCが動作する仕組みにより、メモリからすぐに削除されないことがあります。ただし、表示オブジェクトはすぐに表示リストから削除されます。

しかし、あなたはあなたのクラスのいずれかで、このような何かを行う場合:あなたがそれらを削除している場合

private function removeClip() : void { 
    mc.removeEventListener(Event.ENTER_FRAME, myListener); 
    myClass.removeChild(mc); 
    mc = null; 
} 
+0

こんにちは、プライベート変数はありません:それらはforループで作成され、一時変数だけがそれらへの参照を保持しています(それは破壊されます - 私は関数本体の最後にあります)。 –

+0

それから、 'removeChild()'または 'removeChildAt'を使うだけでいいです。このような何か? 'while(clip.numChildren> 0){clip.removeChildAt(0);} } ' – Bakapii

+0

これはまさに私のコードです。 :-) –

1

private var mc:MovieClip = new MovieClip(); 

private function addClip() : void { 
    mc.addEventListener(Event.ENTER_FRAME, myListener); 
    myClass.addChild(mc); 
} 

次に、あなたは正しくこのようmcを削除したいと思いますループは以下のようになります:

while (clip.childNum > 0) 
{ 
    var child:MovieClip = clip.getChildAt(0); 
    clip.removeChild(child); 

    // remove all listeners 
    child.removeEventListener(...); 

    child = null; 
} 

"child"がカスタムクラスであれば、あなたはakを呼び出すことができますill()メソッドを使用して、クラス/インスタンス内のすべてをクリーンアップします。あなたがすべき、あなたのオブジェクトをスワイプするガベージコレクタの場合

+0

ああ、面白い、ありがとう。 –

関連する問題