我有一个字典,我为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