0

「bigList」と呼ばれるボタンでいっぱいの大きな動的ムービークリップを繰り返しビルドおよび再構築するルーチンがあります。再構築するときは、最初にbigListをトラッシュして、そのインスタンスをステージに繰り返し追加しないようにします(しばらくの間実行していました)。

私はトリックを行うように見えるこのコードを思いついた:

if (bigList.stage)
{
trace("...bigList exists, better trash it");
bigList.parent.removeChild(bigList);
bigList = null;
bigList = new MovieClip();
trace("...done trashing.");
}

動作しているようです...私が心配しているのは、ガベージコレクションやメモリリークなどです。上記を実行することにより、古いbigListを適切に削除して新しいものに置き換えるのでしょうか、それとも、処理する必要のあるデータがメモリ内に存在するのでしょうか。

これに加えて、bigListをビルドするたびに、動的に生成された数十のmcが追加され、それぞれにクリックをチェックするイベントリスナーがあります。毎回bigListをゴミ箱に捨てるとき、それらのインスタンスとリスナーもすべて立ち往生していますか?

bigListのすべての子をトラバースして、それらとそのリスナーもゴミ箱に移動する必要がありますか?それを行う効率的な方法はありますか、トップレベルのオブジェクトとそのすべてのサブオブジェクトとリスナーをゴミ箱に捨てますか、それとも私が持っているコードですでにそれを取得していますか?

本当にありがとう!

4

2 に答える 2

4

ガベージコレクションの素晴らしいところは、ほとんどの作業を自動的に行うことです。あなたがしなければならないのは、オブジェクトへの参照がないことを保証することだけです。それが本当なら、GCはそれ自身のペースでオブジェクトをメモリから削除します(あなたはあなた自身の選択した時間にそれを強制的に空にすることはできません)

上記のコードサンプルから、あなたはそれをうまくやっています、私が提案する1つの小さな変更だけです:

if (bigList.stage)
{
    trace("...bigList exists, better trash it");
    this.removeChild(bigList); // "bgList.parent" is the same as using "this"
    bigList = new MovieClip();
    trace("...done trashing.");
}

新しいオブジェクトを変数にnull入れると、古いオブジェクトに参照がないことを意味するため、変数をに設定する必要はありません。MovieClip

また、bgList.parentすでに親クラスにいるので、使用する必要はありません。を削除しthis.て読みやすくし、煩雑さを減らすこともできますが、そのままにしておくことをお勧めします。

したがって、これらの小さな推奨事項に加えて、あなたは素晴らしい仕事をしており、サンプルに基づいて、コードのそのセグメントによって引き起こされるメモリリークがないはずです。

于 2012-05-01T21:37:04.193 に答える
1

xLiteの答えに加えて、デバッグ中にガベージコレクションプロセスを強制し、参照が適切に削除されているかどうかを確認できます。通常は、直後にを使用して合計RAM使用量を確認します。System.gc() System.totalMemoryNumber

于 2012-05-01T22:59:24.897 に答える