我有以下代码:
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 :(得分: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
。什么是mySo
和data
?你为什么要深入他们?这可能会增加很多耦合。您可能希望重构以执行以下操作:mySo.resetIds();
。