AS3 - 回收物品

时间:2011-12-18 11:13:37

标签: flash actionscript-3

这是在创建对象数组时回收对象的正确,最有效的方法吗?

package com {
    public class CreateList extends MovieClip {
        //this is the object I will be recycling
        private var newProperty:PropertyRow;

        //this is the array I will use to reference the objects
        private var _theRows:Array = new Array();

        public function CreateList() {
            for (var i:uint = 0; i < 1000; i++ ) {
                //null the object
                newProperty = null;

                //create a new instance of the object
                newProperty = new PropertyRow();

                //store a reference to the object before nulling it in the next for loop cycle.
                _theRows.push(newProperty);
            }

            //null the last object that was created in the for loop
            newProperty = null;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

使用new关键字将实例化PropertyRow的新实例。将变量设置为null后,GC不会释放内存,因为实例仍保留在数组中。因此,使用成员变量不会比在创建循环中使用临时变量带来任何性能优势。

如果要优化代码的性能,首先应该尝试使用Vectors而不是Arrays。

重要编辑

正如我在测试another question的矢量性能时发现的那样,这仅适用于数字类型!如果你打算使用任何对象类型的向量,Array实际上会更快!我的下面的其余部分仍然适用,但只使用数组代替Vector.<PropertyRow>

结束编辑

然后,如果它是可以避免的,请不要使用push(),而是使用括号语法(仅当您知道向量的确切大小时 - 这很重要,否则括号语法将不起作用):

var vec_size:int = 1000;
var myArray:Array = new Array (vec_size); 
for (var i : int = 0; i< vec_size; i++) {
    myArray[i] = new PropertyRow(); // if you're not setting any properties, you won't even need a temp variable ;)
}

如果您担心垃圾收集和重用对象,请查看Adobe在object pooling上的参考。

答案 1 :(得分:1)

您不需要为此临时对象创建字段。

package com {
    public class CreateList extends MovieClip {
        //this is the array I will use to reference the objects
        private var _theRows:Array = new Array();

        public function CreateList() {
            var newProperty:PropertyRow;
            for (var i:uint = 0; i < 1000; i++ ) {
                //create a new instance of the object
                newProperty = new PropertyRow();
                //store a reference to the object before nulling it in the next for loop cycle.
                _theRows.push(newProperty); 
            }
        }
    } 
}

在这种情况下,newProperty将是一个局部变量,它将自动销毁然后函数结束。你不需要在任何地方取消它。