Как полностью удалить мувиклип в AS3 - PullRequest
3 голосов
/ 09 июля 2009

Я хочу удалить mc со всеми его таймерами, событиями, ... Есть ли простой способ сделать это?

Ответы [ 4 ]

11 голосов
/ 09 июля 2009

Конечно ... отмените регистрацию его таймеров и событий, удалите его из родительского элемента и удалите все ссылки на него. ;)

То есть AS3 - это язык для сборки мусора, поэтому вы не можете контролировать, когда объект (включая MC) действительно удаляется из памяти. Когда вы удаляете все ссылки на него (включая регистрацию событий), GC обнаружит, что он больше не нужен, и очистит его для вас.

Одна вещь, которую вы можете (и должны) делать, когда вы регистрируетесь для событий, установите для параметра useWeakReference значение true. То есть:

myMC.addEventListener( Event.ENTER_FRAME, onFrame, false, 0, true );

Это говорит AS3, что данный конкретный прослушиватель событий не должен считаться ссылкой - поэтому, если вы удалите все другие ссылки на MC, он будет собирать мусор, даже если вы не отмените регистрацию слушателя. (Что касается таймеров, если вы используете setTimeout или setInterval, насколько я знаю, они также не считаются ссылками. Но я не уверен в этом.)

Так что, если коротко, то нет способа уничтожить ваш MC и заставить Flash очистить все. Именно так работает AS3 - управление ссылками и событиями является частью добросовестного кодирования. Если у вашего MC больше нет таймеров или событий, он удален из своего родителя и на него не ссылается ни одна часть вашего кода, вот тогда он исчез.

2 голосов
/ 09 июля 2009

Loader.unloadAndStop ()

цитата из http://www.gskinner.com/blog/archives/2008/07/additional_info.html:

Вот список действий, которые unloadAndStop делает для подготовки загруженных SWF-файлов к коллекции:

  • Останавливает все мувиклипы
  • Останавливает воспроизведение / воспроизведение всех звуков
  • Стоп / удаление всех объектов Таймера
  • Удалить все глобальные прослушиватели для enterFrame, exitFrame, frameconstructed, активировать, деактивировать
  • Удалить всех слушателей сцены, которые были созданы ребенком.
  • Закрывает все NetConnection / NetStream
  • Microphone.setLoopback (0)
  • Удаляет шрифты AS3 из глобальной таблицы шрифтов
  • Останавливает сокеты, xmlsockets, загрузки файловых ссылок, другие объекты загрузки (SWF внуков) и т. Д.
  • Освобождает растровое изображение, связанное с cacheAsBitmap / filter и т. Д.

Обратите внимание, что все вышеперечисленное выполняется рекурсивно, поэтому они также будут применяться ко всем вложенным дочерним элементам, включая другие загруженные SWF.

1 голос
/ 20 мая 2010

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

например. Я создал класс preloader, который вызывается из корневой временной шкалы в кадре 1 командой:

new PreLoader(root);

На данный момент нет внешней ссылки на PreLoader, и любой _rootClip.loaderInfo.addEventListener (ProgressEvent.PROGRESS, fn) завершится ошибкой (_rootClip - это свойство моего класса PreLoader, и его корень передается как параметр).

То, что я сделал, просто: так как я делаю мувиклип для панели загрузки и добавляю этот мувиклип в корень, этот мувиклип имеет ссылку. Я просто делаю myMC.preloader = this; для ссылки на мой предварительный загрузчик и предотвращения удаления моих событий. Как только я закончу с предварительной загрузкой, простой _rootClip.removeChild(myMC); удалит все:)

1 голос
/ 16 июля 2009

Я видел, что некоторые события, в частности, события таймера, не запускаются, когда для useWeakReference установлено значение true. Так что будьте осторожны с предложением Феномаса. Я обычно создаю функцию dealloc в моих MovieClip и addEventListener(Event.REMOVED_FROM_STAGE, dealloc); Функция dealloc срабатывает, когда вы removeChild() этот MovieClip.

Хорошая практика - позаботиться об этом самостоятельно с помощью Flash, особенно когда возникают несоответствия, которые возникают чаще, чем хотелось бы.

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