2011-12-18 79 views
2

這是在創建對象數組時回收對象的正確,最有效的方法嗎?AS3 - 回收對象

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; 
     } 
    } 
} 

回答

4

使用new關鍵字將實例化PropertyRow的新實例。將變量設置爲null後,GC不會釋放內存,因爲實例仍保留在陣列中。因此,使用成員變量不會在創建循環中使用臨時變量帶來任何性能優勢。

如果您要優化代碼的性能,您應該首先嚐試始終使用矢量而不是陣列。

重要EDIT

正如我發現在測試向量表現爲another question,這是真的只爲數字類型!如果你打算使用任何對象類型的向量,Array實際上會更快!下面我的答案的其餘部分仍然適用 - 只需使用數組而不是Vector.<PropertyRow>

編輯完

然後,如果它是可以避免的,不使用推(),但括號語法(只有當你知道向量的確切大小 - 這是很重要的,否則括號語法韓元「T工作):

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 ;) 
} 

如果你擔心垃圾回收和再利用的對象,也object pooling檢查了Adobe的參考。

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將是一個局部變量,它將自動銷燬,然後函數結束。你不需要在任何地方清零。