Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.03.2013, 22:37
Black Soviet вне форума Посмотреть профиль Отправить личное сообщение для Black Soviet Найти все сообщения от Black Soviet
  № 1  
Ответить с цитированием
Black Soviet
 
Аватар для Black Soviet

Регистрация: Nov 2011
Сообщений: 41
Question Правильное удаление объекта

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

Старый 18.03.2013, 22:41
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
достаточно ли этого для эффективного очищения памяти?
Нет, не достаточно. Слушатель добавленный к объекту - имеет такую же ссылку на объект, как и переменная экземпляра (reference variable). Ее нужно тоже занулять.

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

Старый 18.03.2013, 22:53
Black Soviet вне форума Посмотреть профиль Отправить личное сообщение для Black Soviet Найти все сообщения от Black Soviet
  № 3  
Ответить с цитированием
Black Soviet
 
Аватар для Black Soviet

Регистрация: Nov 2011
Сообщений: 41
Класс Main
Код AS3:
addChild(win1);
Класс Window
Код AS3:
addChild(btn1);
addChild(btn2);
Класс Button
Код AS3:
addEventListener(...)
Теперь мне надо win1 удалить из Main. Для эффективного удаления мне надо сделать не только removeChild(win1), но и удалить слушатели с кнопок btn1 и btn2? Надо ли removeChild и =null применять к кнопкам?

Название: 666.PNG
Просмотров: 530

Размер: 6.8 Кб

Старый 18.03.2013, 23:06
Black Soviet вне форума Посмотреть профиль Отправить личное сообщение для Black Soviet Найти все сообщения от Black Soviet
  № 4  
Ответить с цитированием
Black Soviet
 
Аватар для Black Soviet

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

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

Старый 18.03.2013, 23:22
Александр Мостовой вне форума Посмотреть профиль Отправить личное сообщение для Александр Мостовой Посетить домашнюю страницу Александр Мостовой Найти все сообщения от Александр Мостовой
  № 5  
Ответить с цитированием
Александр Мостовой
 
Аватар для Александр Мостовой

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Проходиться по дереву вложенности дисплей листа не обязательно. Достаточно отписаться от всех событий внутри вложенных данных переопределить пременную win1. Но если вы оставили где-то ссылку на один из вложенных объектов он, естественно, останется в памяти.
Алгоритм сборщика срабатывает не раз в определенное время, а по некоторому алгоритму связанному с заполнением памяти. Поэтому если дорожите объемом памяти занимаемому у пользователя в оперативке, то лучше, по-возможности, обнулять все ссылки на неиспользуемые объекты. В этом случае сборщик будет находить удалять их раньше.

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

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


Последний раз редактировалось Александр Мостовой; 19.03.2013 в 01:10.
Старый 19.03.2013, 10:31
zxcv вне форума Посмотреть профиль Отправить личное сообщение для zxcv Найти все сообщения от zxcv
  № 6  
Ответить с цитированием
zxcv
 
Аватар для zxcv

Регистрация: May 2011
Адрес: 0,0,0 относительно меня
Сообщений: 123
В данном примере кнопки btn1 и btn2 являются полями класса Window.
Занулливание win1 (экземпляра класса Window) таки избавляет нас от необходимости занулливать эти кнопки?

Старый 22.03.2013, 19:23
Black Soviet вне форума Посмотреть профиль Отправить личное сообщение для Black Soviet Найти все сообщения от Black Soviet
  № 7  
Ответить с цитированием
Black Soviet
 
Аватар для Black Soviet

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

Старый 22.03.2013, 21:09
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 8  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
Или есть какие-то лишние действия в этом алгоритме?
Собственно, именно в предлагаемом примере достаточно использовать в листенерах useWeakReference=true.
Тогда из всей последовательности останутся только пункты 4 и 5.

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

Старый 22.03.2013, 21:56
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 9  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Подпишитесь внутри каждого класса на Event.REMOVE_FROME_STAGE в методе которого отписывайтесь от всех подписанных ранее событий.
В итоге когда вы удалите win1 из дисплей листа, то все слушатели его самого и его детей отпишуться автоматически. Останется только занулить win1 по идее.

Старый 22.03.2013, 22:40
Александр Мостовой вне форума Посмотреть профиль Отправить личное сообщение для Александр Мостовой Посетить домашнюю страницу Александр Мостовой Найти все сообщения от Александр Мостовой
  № 10  
Ответить с цитированием
Александр Мостовой
 
Аватар для Александр Мостовой

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Цитата:
В данном примере кнопки btn1 и btn2 являются полями класса Window.
Занулливание win1 (экземпляра класса Window) таки избавляет нас от необходимости занулливать эти кнопки?
Да избавляет, но подозреваю что GB находит несвязанные объекты не одновременно и, возможно, дополненительное зануление объектов большого объема ускорит очищение памяти.

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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:42.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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