Actionscript 3 - Полное удаление ребенка - PullRequest
3 голосов
/ 16 сентября 2008

У меня есть массив объектов, которые при попадании другого объекта в один из них будут удалены. Я удалил его со сцены с помощью removeChild () и удалил из массива с помощью splice (), но каким-то образом объект все еще вызывает некоторые из своих функций, что вызывает ошибки. Как мне полностью избавиться от объекта? С ним также не связаны слушатели событий.

Ответы [ 7 ]

4 голосов
/ 16 сентября 2008

Вы должны убедиться, что экранный объект, который вы удаляете:

  • не имеет зарегистрированных слушателей на сцене, например, Вам нужно позвонить stage.removeEventListener(...) для любого соответствующего stage.addEventListener(...)
  • не имеет прослушивателя для события Event.ENTER_FRAME
  • не прослушивает события на таймерах
  • не вызывается таймером, установленным с помощью setInterval в любом месте
  • и т.д.. в основном все, что связано с таймерами, сценой, ее родителем, загрузчиками и временной шкалой, может привести к задержке объектов и невозможности их удаления

Поэтому, когда вы удалили объект с помощью removeChild и удалили его из массива, в котором вы его держали, также вызовите его метод stop, чтобы убедиться, что он не воспроизводит свою временную шкалу. Также может быть полезно иметь метод для этого объекта, называемый чем-то вроде halt, cleanup или finalize, который отменяет регистрацию любых слушателей, останавливает таймеры, тайм-ауты, интервалы и т. Д., Очищает ссылки (т.е. устанавливает переменные на null) его родителю, сцене или любому другому объекту, который тоже не исчезнет.

1 голос
/ 22 сентября 2008

Чтобы полностью избавиться от объекта в AS3, вы должны установить его значение равным нулю. Уборка мусора не вызовет проблем при ее удалении, поскольку на нее нет ссылок. Также может быть полезно использовать «слабые ссылки» со слушателями событий. При создании прослушивателя событий обычно это тип события и функция, которая должна быть запущена.

addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);

ниже я проиллюстрирую то же самое, но со слабой ссылкой.

addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend, false, 0, true);

Мы знаем, каковы первые два параметра, поэтому давайте начнем с третьего. Третий параметр указывает, запускает ли событие функцию onEventHappened во время фазы захвата (true) или фазы пузырьков (false, что также является значением по умолчанию). Единственная причина, по которой я упоминаю этот параметр, заключается в том, что он необходим перед установкой параметра слабой ссылки. Четвертый параметр является приоритетом и определяет, какие события имеют приоритет при прослушивании одного и того же объекта и одной и той же фазы потока событий. Пятый параметр устанавливает слабую ссылку на истину или ложь, для этого случая мы будем использовать истину, что полезно для сборки мусора.

1 голос
/ 16 сентября 2008

Похоже, у вас возникла проблема со сборкой мусора во флеш-плеере.

В Flash Player 10 был добавлен новый API, который должен решить эту проблему:

unloadAndStop ()

Грант Скиннер имеет больше информации об этом в своем блоге: http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html

Бета-версию Flash Player 10 можно получить по адресу:

http://labs.adobe.com/technologies/flashplayer10/

микрофонные камеры

mesh@adobe.com

0 голосов
/ 17 сентября 2008

Я бы посмотрел на слушателей Event.ENTER_FRAME и TimerEvent.TIMER, чтобы они были удалены до того, как вы удалите объект.

0 голосов
/ 16 сентября 2008

Также не забывайте останавливать и удалять любые связанные таймеры при утилизации удаленных объектов: BIT-101: Таймеры работы не собираются мусором. Когда-либо.

0 голосов
/ 16 сентября 2008

Для вызова функции по определению должен быть где-то слушатель или setTimeOut, либо должна воспроизводиться временная шкала. Убедитесь, что вы удалили всех слушателей и все ссылки на объект. Что это за объект?

Окно вывода или отладчик должны показать вам стек вызовов функций, которые привели к нежелательному вызову. Если вы вставите вывод ошибки в свой вопрос, мы сможем дать вам более точный ответ.

0 голосов
/ 16 сентября 2008

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

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