![]() |
|
||||||||||
|
|||||
|
Регистрация: Nov 2011
Сообщений: 41
|
Ребят, всем приветы.
Есть следующая ситуация. На класс Экран№1 добавлены(addChild) две самописные кнопки со слушателями в самих кнопках. Основной класс может добавить на себя или Экран№1 или Экран№2, то есть требуется удалять один, а вместо него ставить другой, и обратно. Теперь сам вопрос: При удалении Экрана№1, чтобы его захватил Garbage Collector, я удаляю слушатели с кнопок, достаточно ли этого для эффективного очищения памяти? Надо ли зануливать сами кнопки ? Нужно ли зануливать класс Экран№1, после того как я его отремувил с основного класса? |
|
|||||
|
Цитата:
Цитата:
|
|
|||||
|
Регистрация: Nov 2011
Сообщений: 41
|
Класс Main
Класс Window Класс Button Теперь мне надо win1 удалить из Main. Для эффективного удаления мне надо сделать не только removeChild(win1), но и удалить слушатели с кнопок btn1 и btn2? Надо ли removeChild и =null применять к кнопкам? |
|
|||||
|
Регистрация: Nov 2011
Сообщений: 41
|
Правильно ли будет сделать следующие "удаления":
1) removeEventListener с каждой кнопки(Button) 2) removeChild btn1 и btn2 из экземпляра класса Window 3) Занулить btn1 и btn2 в экземпляре класса Window 4) removeChild win1 из Main 5) Занулить win1 в Main Или есть какие-то лишние действия в этом алгоритме? |
|
|||||
|
Проходиться по дереву вложенности дисплей листа не обязательно. Достаточно отписаться от всех событий внутри вложенных данных переопределить пременную win1. Но если вы оставили где-то ссылку на один из вложенных объектов он, естественно, останется в памяти.
Алгоритм сборщика срабатывает не раз в определенное время, а по некоторому алгоритму связанному с заполнением памяти. Поэтому если дорожите объемом памяти занимаемому у пользователя в оперативке, то лучше, по-возможности, обнулять все ссылки на неиспользуемые объекты. В этом случае сборщик будет находить удалять их раньше. Помню у стандартного Tween от Adobe был глюк(который вовсе и не глюк по сути) связанный с тем что при использовании локальных переменных для создания твина сборщик удалял твин во время запуска других приложений съедающих память и анимация отрубалась. Вы можете протестировать удаление самостоятельно вставив в EnterFrame с trace(this) внутри удаляемого обяекта
__________________
... Последний раз редактировалось Александр Мостовой; 19.03.2013 в 01:10. |
|
|||||
|
Регистрация: May 2011
Адрес: 0,0,0 относительно меня
Сообщений: 123
|
В данном примере кнопки btn1 и btn2 являются полями класса Window.
Занулливание win1 (экземпляра класса Window) таки избавляет нас от необходимости занулливать эти кнопки? |
|
|||||
|
Регистрация: Nov 2011
Сообщений: 41
|
Ребят, извините, конечно. А можно конкретно по моему примеру. Какие действия надо осуществить?
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
Тогда из всей последовательности останутся только пункты 4 и 5. http://help.adobe.com/ru_RU/FlashPla...Listener%28%29 |
|
|||||
|
Подпишитесь внутри каждого класса на Event.REMOVE_FROME_STAGE в методе которого отписывайтесь от всех подписанных ранее событий.
В итоге когда вы удалите win1 из дисплей листа, то все слушатели его самого и его детей отпишуться автоматически. Останется только занулить win1 по идее. |
|
|||||
|
Цитата:
В дебагере вы можете проверить удалился ли объект пр помощи принудительного вызова GB коммандой System.gc(); В обычном режиме gb вызывается при нехватке паямти, поэтому сложнее получить его срабаотывание.
__________________
... |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:09. |
|
|
« Предыдущая тема | Следующая тема » |
|
|