清除数组并分配新元素

时间:2011-07-19 16:39:06

标签: arrays performance actionscript-3 memory-leaks

我有以下代码:

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(','));

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

如果之前的数组未在其他任何地方引用,那么它将被标记为垃圾回收。这并不意味着它会立即被销毁,但Flash可以并且会在需要时将其销毁。

答案 1 :(得分: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

但是,根据您的意图,拼接类型的东西可能会更好。例如,如果您使用另一个变量new Array引用currentIds。该引用将继续指向旧数组。

例如

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

答案 2 :(得分:0)

如果我们知道你想要完成什么,那将会有所帮助;特别是如果你试图在数组中创建数组(我不这么认为,但很难说不知道每个部分是什么)。

另外,您没有告诉我们您正在使用的变量类型。 .split()String函数,而不是Array函数。

对于垃圾收集,如果用新的数组替换现有数组(通过任何方法),那么旧数组应该被收集并最终处理掉 - 只要你没有任何其他引用它。

最后,我要指出你可能有一个封装问题 - 严格来说不是代码错误,但可能表明设计不佳。您表明您正在访问mySo.data.currentIds。什么是mySodata?你为什么要深入他们?这可能会增加很多耦合。您可能希望重构以执行以下操作:mySo.resetIds();