Определены ли массивы внутри функции, отброшенной в конце функции в AS3? - PullRequest
2 голосов
/ 06 июля 2011

Любопытный вопрос:

Возьмите эту функцию:

function something():Array
{
    var ar:Array = [];

    var i:MovieClip;
    for each(i in list)
        ar[ar.length] = i.x;

    return ar;
}

Будет ли ar сброшен или он продолжает охлаждаться в моей памяти, добавляя к памяти, используемой каждый раз, когда я вызываю эту функцию?

Мой вопрос относится к каждому из следующих случаев:

  1. var val:Array = something(); (очевидно, val хранится в памяти, но как насчет исходного массива, созданного в функции?)
  2. something();

Может быть, безопаснее всегда делать это вместо этого:

return ar.slice();

Ответы [ 2 ]

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

Сборка мусора производится автоматически флеш-движком. Однако это не происходит мгновенно. Во флэш-памяти все, на что нет ссылок, будет GC'ed.

[Подробнее см. http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html]

Так что для вашей функции case что-то ()

for(var i:int = 0; i<100; i++) {
    something();
}

Ваши 100 или около того сгенерированные массивы будут «охлаждаться» в течение, вероятно, нескольких мс (варьируется), прежде чем их очистит GC. Однако ...

var stupidArr:Array = [];
for(var i:int = 0; i<100; i++) {
    stupidArr.push( something() );
}

Ваши 100 или около того массивов ОСТАЮТСЯ, пока существует переменная 'stupidArr'. Однако, если это произойдет дальше.

stupidArr = null;

OR

stupidArr.pop(); //Looped as desired

До тех пор, пока в массиве вашей функции'thing () 'нет ссылок (очищается при каждом появлении или завершается нулевым). Переменной, доступной для вас. Предмет будет бесплатным для GC. И, следовательно, оставит память.

Так что «Array.slice ()» для вашей функции на самом деле плохая идея, потому что она удваивает потребление памяти до того, как GC (влияет на производительность)

С другой стороны, если, скажем, ваша функция имеет бесполезные переменные, например: ваши счетчики циклов. Они тоже GC'ed, если они не упоминаются в конце дня. Для flash, следовательно, переменная и сборка мусора «довольно просты». Просто знай это правило.

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

1 голос
/ 06 июля 2011

Насколько я знаю, var ar:Array = [] является локальным для функции something() и будет GC'ed при выходе из функции. Если вы не возьмете его, когда функция вернется, как вы предлагаете в случае 1: var val:Array = something(); Вызов something(); не должен накапливать память.

Редактировать:

Я нашел эту ссылку , копаясь в этом; проверьте PowerPoint.

Если вы запустите эту функцию только один раз, массив фактически останется в памяти. Однако любое последующее выделение может запустить сборщик мусора и в конечном итоге удалить ar. Что все еще говорит о том, что переменная ar не будет, в конечном счете, зависать вокруг something() и засорять вашу память.

...