2

かなり大規模なフラッシュ プロジェクトを作成しているため、メモリ使用量が心配です。アプリケーションの各セクションの最後で、コンテンツを保持する包括的な親要素を削除します。これにより親が削除されますが、これにより、これに含まれる各子のメモリも解放されますか、それとも親を削除する前にそれらを削除するために反復を実行する必要がありますか?

私が望むものを表現していない場合に備えて、もう少し説明します。

addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);

このコードを使用して:

removeChild(movie1);

movie2 と movie3 はメモリから削除されますか、それともまだ保存されていて、リンクが解除されているだけですか?

4

3 に答える 3

3

movie2movie3が別のオブジェクトから参照されなくなった場合は、ガベージ コレクションを実行する必要があります。についても同様ですmovie1

ActionScript でビジュアル Flex コンポーネントを作成するから:

コントロールをプログラムで削除するには、removeChild() または removeChildAt() メソッドを使用できます。removeAllChildren() メソッドを使用して、コンテナからすべての子コントロールを削除することもできます。これらのメソッドを呼び出しても、オブジェクトは実際には削除されません。子への他の参照がない場合、Flash Player は将来のある時点でそれをガベージ コレクションに含めます。ただし、その子への参照を何らかのオブジェクトに保存した場合、その子はメモリから削除されません。

于 2010-09-17T09:50:17.123 に答える
1

さて、これまでのところメモリから何も削除されていません。実際には、movie1 がどのように参照されているかによって異なります。後でアプリケーションで再び movie1 を追加したいとします。movie1 がまだここにあるだけでなく、movie2 と movie3 も含まれていることがわかります。

var movie1:ムービークリップ;

なんでもいい();
別の方法();

関数whatever():void
{
    movie1 = new MovieClip();
    var movie2:MovieClip = new MovieClip();
    var movie3:MovieClip = new MovieClip();
    movie1.addChild(movie2);
    movie1.addChild(movie3);
    addChild(movie1);

    ことなど();
}

関数 whatElse():void
{
    // ここではガベージ コレクションは行われず、movie1 は外部に存在します
    // この関数のスコープ
    removeChild(movie1);

    //できるようになりました
    これを試して();

    //しかし、これを行うと、実質的に movie2 と movie3 が殺されます。
    //他の場所では参照されません。
    removeChild(movie1);
    movie1 = null;

    //これはエラーをスローします。movie1 はなくなりました!
    これを試して();
}

関数 tryThis():void
{
    //はい、すべてのコンテンツとともにまだここにあります
    addChild(movie1);
}

関数 anotherMethod():void
{
    var movieN:MovieClip = new MovieClip();
    var movie2:MovieClip = new MovieClip();
    var movie3:MovieClip = new MovieClip();
    movieN.addChild(movie2);
    movieN.addChild(movie3);

    // 必要なことをすべて実行...
    // それから
    removeChild( movieN);
    出て行け();
}

関数 getOut():void
{
   //movieN、movie2、movie3 がなくても人生は続く
   //ガベージコレクション待ち
}
于 2010-09-17T10:30:30.510 に答える
0

もちろん、3つすべてを削除します。

子ムービー 1 には、movie2 + 3 という 2 つの子がいます。インスタンスの死亡により彼が死亡した場合、子も死亡する可能性があります。

多分私は間違っているかもしれませんが、あなたも試すことができます:

trace(movie2);
于 2010-09-17T09:48:31.947 に答える