2013-10-07 125 views
0

爲了防止內存泄漏在ActionScript 3.0中,我使用的成員向量中具有與矢量工作類,例如:在這種情況下如何避免內存泄漏?

public class A 
{ 
    private var mHelperPointVector:Vector.<Point> = new Vector.<Point>(); 


    public static GetFirstData():Vector.<Point> 
    { 
     mHelperPointVector.length = 0; 
     .... 
     return mHelperPointVector; 
    } 


    public static GetSecondData():Vector.<Point> 
    { 
     mHelperPointVector.length = 0; 
     .... 
     return mHelperPointVector; 
    } 
} 

,然後我有消費者誰使用GetFirstData和GetSecondData方法,存儲的引用由這些方法所返回的載體,例如:

public function OnEnterFrame():void 
{ 
    var vector:Vector.<Point> = A.GetSecondData(); 
    .... 
} 

這招似乎是良好的,但有時我需要處理的一段時間後通過GetSecondData()返回的向量,並且在這種情況下,該矢量被另一個調用GetSecondData()或GetFirstData()...覆蓋的解決方案就是將矢量複製到一個新的矢量中......但在這種情況下更好地避免這個技巧。你如何處理這些問題?我必須使用大量的矢量(每個長度在1-10之間)。

+0

大小爲10的兩個向量不應該是一個問題。我想象分配/創建新向量並填充值的問題,但希望看到更多的代碼(需要測試的基本工作示例)才能確定。作爲一個想法,當你做GetFirstData時,你的類A可以有一個布爾標誌來檢查它是否應該清除以前的數據。另外,還有一些脫離主題,請看Object Pools。 –

回答

1

垃圾收集的事情只是儘量避免實例化(和處置)儘可能。很難說什麼是最好的方法,因爲我不明白你是如何/爲什麼使用你的Vector數據,但乍一看我認爲,用你的方法,你會不斷失去數據(你幾乎是創建等價的弱實例,因爲它們可以很容易地被覆蓋)並且改變Vector的長度並不能真正避免垃圾回收(它可能會延遲並減少它,但是你仍然不斷地丟棄數據)。

坦率地說,不要認爲你會有點矢量的內存泄漏,除非你泄漏了向左和向右的引用。在這種情況下,最好修復這些剩餘的引用,而不是簡單地提出一個解決方案來重用相同的向量(可能會產生更多的不利影響)。但是,如果你真的真的關心內存,我認爲你最好的解決方案是要麼提前創建所有你需要的向量(如果它是一個固定的數字,並且你知道它們的長度),或者,更好的是,使用Object Pools。後者肯定是一個更強大的解決方案,但它需要一些設置,無論是通過創建一個Pool類,然後使用它。爲了把它的代碼,一旦實施,就這樣來使用:

// Need a vector with length of 9 
var myVector:Vector.<Point> = VectorPool.get(9); 

// Use the vector for stuff 
... 

// Vector not needed anymore, put it back in the pool 
VectorPool.put(myVector); 
myVector = null; // just so it's clear we can't use it anymore 

VectorPool將控制向量的列表中,您有,讓你的代碼的其他部分「借用」按需向量(其中,他們將被標記爲在VectorPool中被「使用」)並將它們返回(標記爲未使用)。如果在未使用的對象列表中沒有可用的矢量可用,您的代碼也可以根據需要在現場(get()內)創建矢量;這會使它更加靈活(在某些情況下不推薦,因爲你仍然花時間實例化,但在這種情況下可能忽略不計)。

這是一個非常宏的解釋(您仍然需要編寫VectorPool),但是像這樣的對象池被認爲是避免重新實例化的最終解決方案以及垃圾收集被重用。

以供參考,這是我作爲一個非常通用的對象池: https://github.com/zeh/as3/blob/master/com/zehfernando/data/ObjectPool.as

或更專業的一個,我在的情況下使用時,我需要一堆類似大小的一次性BitmapData實例: https://github.com/zeh/as3/blob/master/com/zehfernando/data/BitmapDataPool.as

我相信在你需要的模具中實現VectorPool類將類似於上面的鏈接。作爲一個側面說明,如果性能是一個問題,我建議使用固定長度的向量,例如,

// Create a vector of 9 items, filled with `nulls` 
var myPoints:Vector.<Point> = new Vector.<Point>(9, true); 

這使得它更快,因爲你不會隨着時間的推移微分配。您可以直接設置的項目,而不是使用push()

myPoints[0] = new Point(0, 0); 

但是,這實際上是一個強制的優勢,因爲設置矢量項目比push()更快。