我是否知道跟踪所创建的显示对象的正确方法是什么,因此允许我稍后有效地删除它,以进行垃圾收集。例如:
for(i=0; i<100; i++){
var dobj = new myClass(); //a sprite
addChild(dobj);
}
据我所知,flash的垃圾收集只会收集没有强引用和事件监听器的对象。
由于var dobj
被强烈引用创建的新对象,我也必须“取消”它,我是否正确?
我应该创建一个数组来跟踪循环中创建的所有对象,例如:
var objectList:Array = new Array();
for(i=0; i<100; i++)
{
var dobj = new myClass(); //a sprite
addChild(dobj);
objectList.push(dobj);
}
//remove all children
for each (var key in objectList)
{
removeChild(key as myClass);
}
这是否允许GC在扫描时收集它?
答案 0 :(得分:1)
var dobj
是一个局部变量,所以在你的函数之后,那个引用就消失了。此时,唯一的参考将是项目在显示列表上(即,它正在显示)的事实。所以不需要额外的工作来进行垃圾回收,只需要你需要removeChild()它。当然,其他地方可能会引用其他内容,例如事件监听器等。
你的第二个代码示例应该可以工作,只要你记得不仅要从显示列表中删除它们,而且还要从数组中删除它们。或者您可以使用带有弱引用的Dictionary,然后您不需要将它们从Dictionary中删除。
答案 1 :(得分:0)
是的,如果你没有其它强引用,这确实允许GC收集它,而这通常是在flash中完成的。
尽管不需要removeChild中的强制转换。
另外,请记住将objectList设置为null或新的Array()或将其中的每个元素设置为null。
答案 2 :(得分:0)
大多数垃圾收集器在创建对象时会跟踪它们。 C ++(和GC库)等语言的解决方案是通过new()的包装器分配内存。类似的东西:
var dobj = myNew myClass(); //一个精灵
我对Flex GC不太了解,但通常你应该让它完成它的工作。如果它基于强引用,那么这将有效。