我有一个字典,其中保存了movieclips 的数据,如果我停止使用movieclips,我希望数据被垃圾收集。我正在使用弱键参数,它与其他数据完美配合,但是我遇到了问题。
这段代码很好用:
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:我尝试测试 Aaron 所说的话,并想出了一些奇怪的东西......只是迭代字典(不做任何事情)改变了行为:
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],除非我注释掉指示的行,它不会打印任何内容。