Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Правильное удаление объекта (http://www.flasher.ru/forum/showthread.php?t=196061)

Black Soviet 18.03.2013 22:37

Правильное удаление объекта
 
Ребят, всем приветы.
Есть следующая ситуация. На класс Экран№1 добавлены(addChild) две самописные кнопки со слушателями в самих кнопках.
Основной класс может добавить на себя или Экран№1 или Экран№2, то есть требуется удалять один, а вместо него ставить другой, и обратно.
Теперь сам вопрос: При удалении Экрана№1, чтобы его захватил Garbage Collector, я удаляю слушатели с кнопок, достаточно ли этого для эффективного очищения памяти? Надо ли зануливать сами кнопки ? Нужно ли зануливать класс Экран№1, после того как я его отремувил с основного класса?

caseyryan 18.03.2013 22:41

Цитата:

достаточно ли этого для эффективного очищения памяти?
Нет, не достаточно. Слушатель добавленный к объекту - имеет такую же ссылку на объект, как и переменная экземпляра (reference variable). Ее нужно тоже занулять.

Цитата:

Надо ли зануливать сами кнопки ?
Это ни в коем разе не зануления самого объекта. В ас3 вообще нет возможности "занулить" объект, кроме как с помощью сборщика мусора. Так что задание переменной значения null, всего лишь забирает у нее ссылку на объект, а сам объект продолжает валяться в "куче". Поэтому чтобы сборщик мусора смог убить объект, нужно убрать ВСЕ ссылки на него.

Black Soviet 18.03.2013 22:53

Вложений: 1
Класс Main
Код AS3:

addChild(win1);

Класс Window
Код AS3:

addChild(btn1);
addChild(btn2);

Класс Button
Код AS3:

addEventListener(...)

Теперь мне надо win1 удалить из Main. Для эффективного удаления мне надо сделать не только removeChild(win1), но и удалить слушатели с кнопок btn1 и btn2? Надо ли removeChild и =null применять к кнопкам?

Вложение 29296

Black Soviet 18.03.2013 23:06

Правильно ли будет сделать следующие "удаления":
1) removeEventListener с каждой кнопки(Button)
2) removeChild btn1 и btn2 из экземпляра класса Window
3) Занулить btn1 и btn2 в экземпляре класса Window
4) removeChild win1 из Main
5) Занулить win1 в Main

Или есть какие-то лишние действия в этом алгоритме?

Александр Мостовой 18.03.2013 23:22

Проходиться по дереву вложенности дисплей листа не обязательно. Достаточно отписаться от всех событий внутри вложенных данных переопределить пременную win1. Но если вы оставили где-то ссылку на один из вложенных объектов он, естественно, останется в памяти.
Алгоритм сборщика срабатывает не раз в определенное время, а по некоторому алгоритму связанному с заполнением памяти. Поэтому если дорожите объемом памяти занимаемому у пользователя в оперативке, то лучше, по-возможности, обнулять все ссылки на неиспользуемые объекты. В этом случае сборщик будет находить удалять их раньше.

Помню у стандартного Tween от Adobe был глюк(который вовсе и не глюк по сути) связанный с тем что при использовании локальных переменных для создания твина сборщик удалял твин во время запуска других приложений съедающих память и анимация отрубалась.

Вы можете протестировать удаление самостоятельно вставив в EnterFrame с trace(this) внутри удаляемого обяекта

zxcv 19.03.2013 10:31

В данном примере кнопки btn1 и btn2 являются полями класса Window.
Занулливание win1 (экземпляра класса Window) таки избавляет нас от необходимости занулливать эти кнопки?

Black Soviet 22.03.2013 19:23

Ребят, извините, конечно. А можно конкретно по моему примеру. Какие действия надо осуществить?

mikhailk 22.03.2013 21:09

Цитата:

Или есть какие-то лишние действия в этом алгоритме?
Собственно, именно в предлагаемом примере достаточно использовать в листенерах useWeakReference=true.
Тогда из всей последовательности останутся только пункты 4 и 5.

http://help.adobe.com/ru_RU/FlashPla...Listener%28%29

samana 22.03.2013 21:56

Подпишитесь внутри каждого класса на Event.REMOVE_FROME_STAGE в методе которого отписывайтесь от всех подписанных ранее событий.
В итоге когда вы удалите win1 из дисплей листа, то все слушатели его самого и его детей отпишуться автоматически. Останется только занулить win1 по идее.

Александр Мостовой 22.03.2013 22:40

Цитата:

В данном примере кнопки btn1 и btn2 являются полями класса Window.
Занулливание win1 (экземпляра класса Window) таки избавляет нас от необходимости занулливать эти кнопки?
Да избавляет, но подозреваю что GB находит несвязанные объекты не одновременно и, возможно, дополненительное зануление объектов большого объема ускорит очищение памяти.

В дебагере вы можете проверить удалился ли объект пр помощи принудительного вызова GB коммандой System.gc();

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


Часовой пояс GMT +4, время: 10:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.