как удалить / gc объект в Actionscript 3? - PullRequest
20 голосов
/ 02 апреля 2009

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

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

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

Ответы [ 6 ]

22 голосов
/ 02 апреля 2009

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

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

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

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

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

P.S .: Чтение Гранта Скиннера статей на память во флеш-плеере - это действительно хорошая идея.

5 голосов
/ 25 марта 2010

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

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

1 голос
/ 02 апреля 2009

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

try {
   new LocalConnection().connect('foo');
   new LocalConnection().connect('foo');
} catch (e:*) {}
// the GC will perform a full mark/sweep on the second call.
1 голос
/ 02 апреля 2009

Сначала вы должны прочитать о сборке мусора, 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 обрабатывает все это внутри.

1 голос
/ 02 апреля 2009
System.gc()
// Forces the garbage collection process. 

Ссылка:

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html

1 голос
/ 02 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...