Очистить массив назначить новые элементы - PullRequest
1 голос
/ 19 июля 2011

У меня есть следующий код:

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 ]

2 голосов
/ 19 июля 2011

Ваш синтаксис соединения неправильный.

С помощью соединения вы помещаете 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

против

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 голосов
/ 19 июля 2011

Если на предыдущий массив больше нигде нет ссылок, он будет помечен для сборки мусора.Это не означает, что он будет немедленно уничтожен, но Flash может и будет уничтожать его, когда это необходимо.

0 голосов
/ 19 июля 2011

Было бы полезно, если бы мы знали, чего вы пытаетесь достичь;в частности, если вы пытаетесь создать массивы внутри массивов (я так не думаю, но трудно сказать, не имея представления о том, для чего предназначен каждый фрагмент).

Кроме того, вы не сообщили нам об этомс какими типами переменных вы работаете..split() - это функция String, а не Array.

Что касается сборки мусора, если вы замените существующий массив новым (любым другим способом), тогда старый массив должен быть собрани утилизировать в конце концов - если у вас нет других ссылок на него.

Наконец, я бы указал, что у вас может быть проблема с инкапсуляцией - не просто ошибка кода, но, возможно,указывает на плохой дизайн.Вы показываете, что вы получаете доступ к mySo.data.currentIds.Что такое mySo и data?И почему ты лезешь в них?Это потенциально добавляет много связи.Возможно, вы захотите рефакторинг сделать что-то вроде: mySo.resetIds(); вместо.

...