2011-07-19 60 views
1

我有以下代碼:清除數組分配新的元素

if ((mySo.data.currentIds != null) && 
    (mySo.data.currentIds.length > 0)) 
    currentIds = mySo.data.currentIds.split(','); 

此前,currentIds與此代碼初始化:

currentIds = new Array(-1, -1, -1); 

我想問,如果這是替換的最好方式新陣列中的元素:

currentIds = mySo.data.currentIds.split(','); 

我在說內存泄漏和性能。我不知道`currentIds'的前一個實例是否從內存中清除。

也許,我能做到這一點,而不是:

currentIds.splice(0, 3, mySo.data.currentIds.split(',')); 

有什麼建議?

+0

我沒有看到任何問題。假設你的數組只包含數字,而不是對象的引用......在我看來,你只是創建一個新的數組。 – Corey

+0

與前一個數組分配給'currentIds'有什麼關係?我是否創建了內存泄漏? – VansFannel

+1

@VansFannel,如果你有很多對currentIds的引用,你可能會造成內存泄漏。雖然可能沒關係。然而,你的'拼接'沒有做你認爲它正在做的事情。請參閱下面的答案。 –

回答

2

如果前面的數組在其他地方沒有被引用,那麼它將被標記爲垃圾收集。這並不意味着它會立即被銷燬,但Flash可以並且會在需要時銷燬它。

2

拼接語法不好。

隨着拼接,你正在做的是把mySo.data.currentIds.split(',')currentIds第一指標是什麼:

var currentIds:Array = [-1, -1, -1]; 
currentIds.splice(0, 3, [1,2,3]); 
//The entire array is in index 0: 
trace(currentIds.length); //1 
trace(currentIds[0]);  //1,2,3 

但是,這取決於你打算什麼,事情的拼接型可以更好。例如,如果您在其他地方使用其他變量引用currentIds,則可以使用new Array。該引用將繼續指向舊數組。

例如。

var currentIds:Array = [-1, -1, -1]; 
var currentIdsReference:Array = currentIds; 
currentIds = [1,2,3]; 
trace(currentIdsReference); //-1,-1,-1 

VS

var currentIds:Array = [-1, -1, -1]; 
var currentIdsReference:Array = currentIds; 
currentIds.length = 0; 
currentIds.push.apply(null, [1,2,3]); 
trace(currentIdsReference); //1,2,3 
0

這將是有益的,如果我們知道你要完成的任務;特別是如果你試圖在數組中創建數組(我不這麼認爲,但是很難說不知道每個數組是什麼)。

此外,您沒有讓我們知道您正在使用的變量類型。 .split()String函數,而不是Array函數。至於垃圾收集,如果你用新的數組替換現有的數組(通過任何方法),那麼舊數組應該被收集並最終處理 - 只要你沒有任何其他的引用。

最後,我想指出,你可能有一個封裝問題 - 不是嚴格的代碼錯誤,但可能表明設計不佳。你表明你正在訪問mySo.data.currentIds。什麼是mySodata?你爲什麼深入他們?這可能會增加很多耦合。您可能需要重構以執行如下操作:mySo.resetIds();