AS3中对象的内存使用和垃圾回收

时间:2011-06-01 07:25:06

标签: flash actionscript-3 garbage-collection

我想知道关于Flash中垃圾收集的Object类型。

我知道在这种情况下,物品将为垃圾收集做好准备:

// create
var ar:Array = [];

var mc:MovieClip = new MovieClip();
mc.addEventLisntener(blah, blah);

ar.push(mc);
addChild(mc);

// kill & gc
ar.splice(0, 1);
mc.removeEventListener(blah, blah);
removeChild(mc);

Object如何/将会在下面的情况下收集垃圾。

假设我在班级MartysMC中有一个功能,我通过以下方法解析Object

package
{
    import flash.display.MovieClip;

    public class MartysMC extends MovieClip
    {
        /**
         * Updates this
         * @param obj An object containing key/value pairs to represent new property values
         */
        public function update(obj:Object):void
        {
            var i:String;
            for(i in obj)
            {
                this[i] = obj[i];
            }
        }
    }
}

现在我像这样使用这个函数:

var mmc:MartysMC = new MartysMC();

var dataObject:Object =
{
    x: 10,
    y: 34,
    alpha: 0.6
};

mmc.update(dataObject);

dataObject会怎样?这会从这里收集垃圾吗?即使如此,这一行中的对象如何:

mmc.update({x:15,y:18,name:"marty"});

2 个答案:

答案 0 :(得分:3)

要查看GC发生了什么,您可以使用Dictionary将弱引用设置为true并使用您想要作为关键字的对象:

var d:Dictionary = new Dictionary(true)
d[myObject] = whatever

当对象不再可用时,它将从字典中删除。

这里有一个基于你在wonderfl的例子的完整示例: http://wonderfl.net/c/e9W4

你很快就会看到你的对象都被垃圾收集了。

答案 1 :(得分:2)

在您的示例中,创建临时对象,传递到函数,由其属性迭代,然后应在下一次GC传递时收集它。没有什么可以把它保存在内存中(虽然GC传递可能不会立即出现,但是还没有办法(但)确实知道这一点。)如果您有疑问,我会添加该属性访问权限({{1} })不创建对临时对象的引用 - 只复制属性(按值复制基本类型,并复制类引用。)