我有一個字典,我爲movieclips保存數據,如果我停止使用動畫片段,我希望數據被垃圾收集。我正在使用弱密鑰參數,並且與其他數據完美協作,但是我遇到了一個問題。MovieClip沒有從字典中刪除
此代碼的偉大工程:
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);
}
這樣可以使印刷[對象影片剪輯]每一幀,除非我註釋掉指定的行,它不打印任何內容。
好吧,所以我不認爲這會修復您的引用計數問題...您將該對象設置爲null,在刪除它之後。如果引用計數稍後遞減,如果該對象已經爲空,則可能會導致一些奇怪的行爲...? – 2008-10-17 20:49:01
在你的第二個例子中,你註釋掉的那一行創建了一個你忘記設置爲null的mc(objecto)的新引用。嘗試:for(var objecto in dic){}; objecto = null; – 2008-10-18 12:26:20
就是這樣!謝謝! – Turambar 2008-10-20 15:49:08