AS3で親を削除:これはすべての子供が使用する記憶を解放しますか?
-
03-10-2019 - |
質問
私はかなり大きなフラッシュプロジェクトを行っているので、メモリの使用が心配です。アプリケーションの各セクションの最後に、コンテンツを保持する包括的な親要素を削除します。これは親を削除しますが、これにはこれに含まれる子供のそれぞれの記憶も解放されますか、それとも親を除去する前にそれらを削除するために反復を実行する必要がありますか?
ケース内でもう少し説明をしてください。私が欲しいものを表現していません:
addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);
このコードを使用して:
removeChild(movie1);
Movie2とMovie3をメモリから削除しますか、それともまだリンクされていないだけで保存されていますか?
解決
まあ、これまでのところメモリから削除されたものは何もありません。それは本当にムービー1の参照方法に依存します。ムービー1を再度追加するアプリケーションの後半では、ムービー1がまだここにいるだけでなく、ムービー2とムービー3が含まれていることがわかります。
var movie1:MovieClip; whatever(); anotherMethod(); function whatever():void { movie1 = new MovieClip(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); movie1.addChild(movie2); movie1.addChild(movie3); addChild(movie1); whateverElse(); } function whateverElse():void { //here, nothing is garbage collected, movie1 exists outside //the scope of this function removeChild(movie1); //now you can tryThis(); //but if you do this you're effectively killing movie2 & movie3 , since //they're not referenced anywhere else. removeChild(movie1); movie1 = null; //this is going to throw an error , movie1's gone! tryThis(); } function tryThis():void { //yes ,it's still here with all its content addChild(movie1); } function anotherMethod():void { var movieN:MovieClip = new MovieClip(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); movieN.addChild(movie2); movieN.addChild(movie3); // do all you need to do... // then removeChild( movieN); getOut(); } function getOut():void { //life goes on without movieN, movie2 & movie3 //waiting to be garbage collected }
他のヒント
もしも movie2
と movie3
もう別のオブジェクトによって参照されておらず、ゴミ収集されるべきです。同じことが当てはまります movie1
.
から ActionScriptで視覚的なフレックスコンポーネントを作成します :
プログラムでコントロールを削除するには、RemoveChild()またはRemoveChildat()メソッドを使用できます。また、RemoveallChildren()メソッドを使用して、コンテナからすべての子供のコントロールを削除することもできます。これらのメソッドを呼び出すと、実際にはオブジェクトが削除されません。子供への他の参照がない場合、Flashプレーヤーは、将来のポイントでGarbage Collectionにそれを含めます。しかし、その子供への参照をある程度のオブジェクトに保存した場合、子供は記憶から取り除かれません。
もちろん、3つをすべて削除します。
子ムービー1には2人の子供、ムービー2 + 3があります。
たぶん私は間違っていますが、あなたも試すことができます:
trace(movie2);