Подтвердить что ты не робот

Как удалить /gc объект в ActionScript 3?

Я хочу удалить/принудительно удалить сборку мусора из экземпляра класса изнутри. Очевидно, что this = null и delete this не работают. Я могу это сделать, или я лаяю неправильное дерево? Я в основном ищу деструктора какого-то рода.

У меня есть экземпляр класса, который пытается загрузить XML файл, и если файл не найден, я хочу уничтожить экземпляр, желательно изнутри. Дело в том, что нужно сделать некоторые вещи в родительском классе в зависимости от того, является ли дочерний экземпляр нулевым или нет.

Я подумал о том, чтобы передать событие родительскому объекту и удалить его оттуда, но я бы предпочел сделать это, только если нет другого пути.

4b9b3361

Ответ 1

Вам не следует пытаться удалить объект из себя - это плохая практика, и в AS3 вы не можете это сделать точно.

Объект может быть удален (т.е. собранный мусор), только если ссылки на этот объект отсутствуют. Поскольку ссылки всегда передаются по значению, и объект обычно не знает, какие ссылки на него существуют, вы не можете удалить объект из себя. Единственное полезное, что вы можете сделать, это создать метод, который очистит все ресурсы, используемые экземпляром. Такой метод будет служить деструктором, но вам придется называть его вручную. Не забывайте, что прослушиватели событий также предотвратят сбор мусора, если вы не удалите их.

Существует также разница между delete 'свойство и установкой его на null. Эффективно delete удалит свойство из экземпляра динамического класса. Если значение свойства null не удалит свойство, но удалите все ссылки, которые там были сохранены. Поэтому оба действия уничтожат ссылку, которая была сохранена в каком-либо свойстве. Обратите внимание, что вы не можете delete объект, только свойство.

Существуют определенные хаки, которые можно использовать для инициирования сбора мусора в flash-плеерах 9 и более старых. Однако недавно появился вызов System.gc(), что делает то же самое. Обратите внимание, что вы не можете действительно полагаться на то, что GC действительно будет вызван. Это зависит от флеш-плеера.

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

P.S.: Чтение Grant Skinner статьи по памяти в flash-плеере на самом деле хорошая идея.

Ответ 2

Если объект был добавлен в DisplayContainer с помощью метода addChild(), вы можете удалить объект из контейнера из объекта, используя parent.removeChild(this). Если после этого нет ссылок на оставшийся объект, он будет собран сборщиком мусора.

Единственная проблема заключается в том, что у вас есть слушатели событий внутри объекта, которые можно либо вручную удалить, либо позволить сборщику мусора сделать это для вас, установив для всех слушателей значение weakReference = true.

Ответ 3

AS3 не дает вам никаких деструкторов. Лучшее, что вы можете сделать, это установить все ссылки на null и скрестить пальцы - что GC заметит его и освободит память.

Ответ 5

Сначала вы должны прочитать о сборке мусора, Grant.S написал хорошую статью об этом:

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

Дело не в том, чтобы установить класс в значение null, но удалить все его ссылки, включая слушатели. Когда он полностью осиротеет, мусор может забрать его в какой-то момент.

Основной пример:

// References a newly created sprite
var reference:Sprite = new Sprite();

// Removes the reference, the Sprite is now orphaned and will probably be garbage collected within some seconds.
reference = null;

Хорошей практикой является систематическое создание метода "destruct" на всех ваших классах, который удаляет все внутренние ссылки, размещает растровые изображения, удаляет прослушиватели событий и т.д., после чего вам просто нужно будет беспокоиться о том, чтобы отключить внешние.

Если вы используете FLEX Builder, вы можете использовать профилировщик, чтобы визуализировать, как Flash Player обрабатывает все это внутри.

Ответ 6

Вот неподдерживаемый способ принудительного сбора мусора из GSkinner.

try {
   new LocalConnection().connect('foo');
   new LocalConnection().connect('foo');
} catch (e:*) {}
// the GC will perform a full mark/sweep on the second call.