这是在创建对象数组时回收对象的正确,最有效的方法吗?
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;
}
}
}
答案 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将是一个局部变量,它将自动销毁然后函数结束。你不需要在任何地方取消它。