Вопрос по actionscript-3, flash, actionscript – Как полностью удалить мувиклип в AS3

3

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

Ваш Ответ

4   ответа
1

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

НАПРИМЕР. Я создал класс preloader, который вызывается из корневой временной шкалы в кадре 1 командой:

new PreLoader(root);

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

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

2

Loader.unloadAndStop ()

цитируется изhttp://www.gskinner.com/blog/archives/2008/07/additional_info.html :

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

  • Stops all MovieClips
  • Stops all sounds playing/streaming
  • Stop/removes all Timer objects
  • Remove all global listeners for enterFrame, exitFrame, frameconstructed, activate, deactivate
  • Remove all stage listeners that have been created by the child.
  • Closes all NetConnection/NetStream
  • Video.attachNetStream/attachCamera(0)
  • Microphone.setLoopback(0)
  • Removes AS3 fonts from the global font table
  • Stops sockets, xmlsockets, filereference downloads, other downloading objects (grandchildren SWF), etc.
  • Frees bitmap related to cacheAsBitmap/filter, etc.

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

Обратите внимание, что это только для загруженных SWF-файлов, а не для MovieClips.
11

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

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

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

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

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

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

1

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

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

Похожие вопросы