ムービークリップのデータを保持するディクショナリがあり、ムービークリップの使用をやめた場合にデータをガベージ コレクションしたいと考えています。弱いキー パラメータを使用しています。他のデータとは完全に連携しますが、問題が発生しました。
このコードはうまく機能します:
var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
mc = null;
System.gc();
System.gc();
for (var obj in dic)
trace(obj); //this doesn't execute
しかし、実際にムービークリップを使用すると、動作しなくなります:
var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;
System.gc();
System.gc();
for (var obj in dic)
trace(obj); //this prints [object Movieclip]
なぜこれが起こるのですか?それは私が間違っていることですか?回避策はありますか?
編集:この特定の例では、を使用できることはわかっていますdelete dic[mc]
が、もちろんこれは単純化されたケースです。一般に、ムービークリップをディクショナリから手動で削除する必要はありませんが、アプリケーションの残りの部分でムービークリップを参照しなくなった場合は自動的に削除する必要があります。
Edit2:アーロンが言ったことをテストしてみましたが、奇妙なことを思いつきました...辞書を(何もせずに)反復するだけで動作が変わります:
var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;
for (var objeto in dic) {} // <-- try commenting out this line
addEventListener('enterFrame', f); // I print the contents every frame, to see if
// it gets removed after awhile
function f(evento)
{
System.gc();
System.gc();
for (var objeto in dic)
trace(objeto);
}
これは、何も印刷されない指定された行をコメントアウトしない限り、[object Movieclip] をすべてのフレームで印刷し続けます。