如何跟踪垃圾收集对象

时间:2010-04-28 17:29:02

标签: flex flash actionscript-3

我是否知道跟踪所创建的显示对象的正确方法是什么,因此允许我稍后有效地删除它,以进行垃圾收集。例如:

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在扫描时收集它?

3 个答案:

答案 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不太了解,但通常你应该让它完成它的工作。如果它基于强引用,那么这将有效。