> Разумеется каждый раз при запуске нового раздела, предыдущий удаляется с
> помощью removeChild
> Или этого недостаточно?
1. главное, чтобы ссылок не оставалось.
2. сразу память не очищается. Сборщик мусора срабатывает
позже, по собственной логике.
> 1. главное, чтобы ссылок не оставалось.
> 2. сразу память не очищается. Сборщик мусора срабатывает
> позже, по собственной логике.
>
>
Сборщик мусора запускается когда идет попытка выделения памяти под любой
новый объект, насколько я помню.
> 1. главное, чтобы ссылок не оставалось.
Картинки после загрузки переводятся в Битмапдату, а Loader'ы их загрузившие очищаются unload'om
> Ссылок на удаляемый объект?
- да.
и чтобы объект не был подписан
на события внешних объектов,
например stage.
у всего, что ты хочешь удалить
- не должно быть запущенных setTimeout() и setInterval()
- не должно быть запущенных таймеров
- не должно быть работающих онентерфреймов (даже если ты подписан на что-то
внутри удаляемого объекта)
- не должно быть ссылок на внешние объкты (и у внешних объектов, понятное
дело, не должно быть ссылок на что-то внутри удаляемого)
я лично во всех объектах, которые подразумевают динамическое создание и
удаление, прописываю метод destroy(), который сносит все ссылки не-примитивных
типов и все подписки.
чобы проверить, что все сделано правильно, можно сделать следующее:
- запуситься из-под флекс билдера в дебаг режиме и запустить gc
- или сделать в приложении кнопку, которая запустит System.gc() (проверять в
дебаговом плеере, разумеется)
- или использовать старый хак, который тоже приводит к принудительному запуску gc:
try {
new LocalConnection().connect("_gc");
new LocalConnection().connect("_gc");
} catch (error : *) {
}
-- если принудительно устроить запуск gc, то можно увидеть, чистится ли память
на самом деле, или нет.
--
Michael Antipin
______________________________________________________________________
n...@skazkastudio.ru | http://www.skazkastudio.ru
И то-есть, получается если какой-нибудь несчатный спрайт отрисовывает внутри себя БитмапДату, и потом мы этот спрайт удаляем, то БитмапДата так и остается в оперативе навсегда, если её не dispose()?
> а в AS2 старый-добрый removeMovieClip
> тоже ничего по сути не удалял?
- сам объект-мувиклип не удалялся (если
оставалась на него ссылка), рекурсивно
удалялись дочерние мувики, а также любое
содержимое. Также у мувика сносились
служебные линки на прототипы, конструктор
и т.п.
Что касается твоего основного вопроса
и поиска универсального решения.
По идее оно есть - использование
weekReference - мягких ссылок при
подписывании на событие.
В этом случае тебе можно не заботиться
об отписке. Точнее не всегда заботиться:
высоконагруженные операции и часто
вызываемые события всё равно нужно
сносить руками. Такие как onEnterFrame.
Но, с моей точки зрения, использование
weekReference - нехороший признак,
сигнализирующий, что автор кода либо
лентяй откровенный, либо, что еще хуже
не понимает сути происходящего у него
в коде.
Более приемлемое решение использовать
события addedToStage и removedFromStage
При добавлении на сцену подписывать всё
что нужно, при удалении отписывать.
Но и к этому не следует подходить как
к универсальному решению: это лишь
часть потока исполнения программы,
лишь удобные точки для отслеживания,
но не единственные и не всегда идеально
подходящие.
Еженедельный журнал по программированию на АС. :)
http://www.google.ru/search?q=ActionScript+weakReference
System.gc() замечательная штука но она работает только в дебаг плеере.
--
Denis Sheremetov
Конечно, у тебя же debug version плеера со standalone этого не будет.
--
Denis Sheremetov