Actionscript управление памятью, сборка мусора - PullRequest
2 голосов
/ 04 мая 2011

В этом блоге (и других) говорится, что вы должны устанавливать нулевые ссылки на объекты внутри методов dispose () при очистке объектов.

Тем не менее, Actionscript 3 (с Flash Player 9) использует mark и sweep , чтобы очистить круговые ссылки для вас. Поэтому мне интересно: есть ли какая-либо причина для аннулирования ссылок на ваши объекты?

Ответы [ 2 ]

6 голосов
/ 04 мая 2011

Я никогда не делаю - до тех пор, пока вы делаете очевидное:

  • Разбить все ссылки на объект (удалить из массивов, установить переменные, хранящие объект в null, удалить из списка отображения)
  • Удалить всех прослушивателей событий и т. Д.

Тогда память, использованная объектом, будет доступна для перезаписи в любое время.

var ar:Array = [];
var mc:MovieClip = new MovieClip();

mc.addEventListener(MouseEvent.CLICK, pants);

ar[ar.length] = mc;
addChild(mc);

if(mc.parent) mc.parent.removeChild(mc); // not garbage collected
mc.removeEventListener(MouseEvent.CLICK, pants); // still not garbage collected
ar.splice(0, 1); // finally garbage collected
2 голосов
/ 04 мая 2011

Фантастический обзор управления памятью - презентация Гранта Скиннера:

http://gskinner.com/talks/resource-management/

В целом, я никогда не null сами объекты, но обнуляю объекты, ссылающиеся на них (есть тонкое, но важное отличие). Все ссылки должны быть уничтожены, а также прослушиватели событий и т. Д.

При добавлении прослушивателей событий установите привычку для прослушивателя равным weak.

o.addEventListener(MouseEvent.CLICK, onClick, false, 0, true);

В этом нет недостатка, и это означает, что если вы обнулите все ссылки на ваш объект o, но к нему все еще подключены слушатели, они удалят себя, и объект все равно можно будет пометить как gc'ed. Вы все равно должны сами справляться с удалением слушателей.

"не ленись - убирайся после сам! "

Наконец, вы можете использовать класс Janitor, чтобы помочь контролировать / очищать ваши ресурсы:

http://gskinner.com/libraries/

...