#flash #actionscript-3
#flash #actionscript-3
Вопрос:
У меня есть вопрос относительно управления памятью AS3, с которым я хотел бы знать, может ли кто-нибудь мне помочь.
Предположим, я создал переменную экземпляра для класса, в данном случае или типа Sound:
public class SoundStore extends Sprite{
var s:Sound;
Затем в различных функциях класса я ссылался на эту переменную несколько раз, каждый раз, когда я хотел загрузить новый звук:
s = new Sound();
Прав ли я, полагая, что каждый раз, когда я создаю новый звук, я перезаписываю предыдущую выделенную память?
Спасибо
Ответ №1:
№. AS3 — это язык сбора мусора, который использует подсчет ссылок для удаления неиспользуемых объектов.
s
Переменная является внутренним указателем на блок памяти, который содержит Sound
объект. Каждый раз, когда вы это делаете, s = new Sound()
AS3 создаст новый Sound
объект в памяти и установит s
указатель на адрес этого объекта. Старый объект все еще существует в памяти. Если у вас нет ссылок на старый объект, сборщик мусора удалит объект в какой-то момент, обычно в следующем раунде сбора. Это означает, что в любой момент времени у вас может быть несколько Sound
объектов в памяти, на которые нет ссылок, но которые все еще используют ресурсы. Сборщик мусора предназначен для периодического просмотра всех выделенных объектов и удаления их, если на них нет ссылок.
Вот хорошая статья о GC во Flash / AS3:http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html
Комментарии:
1. Хорошо, спасибо. Я понимаю, что у меня нет конкретного контроля над тем, когда запускается GC. Если бы я сделал следующее, помогло бы это моему управлению памятью: попробуйте { s = null; } поймать (e: Ошибка) {} s = новый звук ();
2. No. s перестанет указывать на этот экземпляр Sound, но он все равно будет находиться в памяти до тех пор, пока ничто другое во всем вашем приложении не укажет на него. (Сюда входят события, если
useWeakRefereces
не установлено значение true).3. Вы можете вызвать
System.gc()
принудительную сборку мусора во Flash 10 и более поздних версиях, но это ДЕЙСТВИТЕЛЬНО плохая идея. Это полностью снижает производительность и даже не гарантирует выполнения чего-либо за пределами отладки.4. Итак, каков был бы наиболее эффективный с точки зрения памяти способ настройки моего кода, если я ожидаю загружать несколько файлов MP3 по одному и воспроизводить их, опять же, только по одному за раз. Было бы так, как указано выше, гарантируя, что у текущего s не было ссылок, указывающих на него, прежде чем я создал новый звук и выделил его для s?
5. Просто установите для всех ссылок на него значение null и продолжайте в обычном режиме. Сборщик мусора будет выполнять свои обходы достаточно часто, чтобы это не было проблемой. Единственное, о чем вам нужно беспокоиться, это убедиться, что все ссылки на него очищены.