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

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

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

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
По умолчанию Загружаемая флешка и дочерний аппдомен

Потребовалось сделать многоSWFочное приложение, состоящее из кучи "модулей". Модули имели свои интерфейсы, я их грузил в дочерний аппдомен, чтобы можно было приводить swf к этим интерфейсам.

А тут что-то смотрю: утечки памяти. начал копать, оказалось, что это баг плеера (иначе это не назвать). При Loader#unloadAndStop() загруженная флешка удалялась, да не совсем: профайлер (на трех проверил даже) показывал, что все экземпляры подгружаемой флешки остаются в памяти и постоянно копятся. Постоянно. Не чистятся GC вообще.

В итоге я отказался от интерфейсов и дочернего аппдомена, начал использовать Object на свой страх и риск. А тут что-то смотрю, вызываю у swf метод, передаю в нем массив с кастомными экземплярами классов, а они на том конце успешно подхватываются, кастуются к аналогичным классам подгруженной swf и свойства с методами доступны...

Начал проводить эксперименты. Интерфейс заработал. И GC успешно чистит из памяти весь хлам. То есть загрузка вида
Код AS3:
_loader.load(new URLRequest(url));
заработала аналогично
Код AS3:
_loader.load(new URLRequest(url), new LoaderContext(false, ApplicationDomain.currentDomain));
Вот я теперь сижу весь в непонятках — КАК?!
Как это работает? Объясните, пожалуйста.
__________________
тут я

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

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
а они на том конце успешно подхватываются, кастуются к аналогичным классам подгруженной swf и свойства с методами доступны...
Без указания контекста LoaderContext классы загружаются в дочерний домен лоадера. Лоадер, как я понял находится в дочернем к системному домену. Т.е. загрузка идет в new ApplicationDomain(ApplicationDomain.currentDomain).
Если обращаются к классам, существующим и в дочернем(-них) и в родительском домене, то используется класс из самого верхнего родительского домена. "Перетирания" не происходит. Вызвать класс из дочернего домена можно путем обращения к этому домену super.loaderInfo.applicationDomain.getDefinition();

Т. о. загруженная свф не кастует, а использует класс из родительского домена. Если fully qualified classname и сигнатуры методов совпадают, то все ок. Проведите эксперименты комбинируя одинаковое class local name в fully qualified classname и разные/совпадающие namespace, а также разные/совпадающие method signature.

Если будете загружать в ApplicationDomain.currentDomain, являющийся дочерним по отношению к system domain, то код практически никогда из него не выгрузится, т.к. минимальным квантом выгрузки является сам домен. А это теоретически может произойти, если будет выгружены все дочерние по отношению к currentDomain свф, и сам документ класс. Сомневаюсь в возможности его выгрузки.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 01.10.2012, 08:34
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 3  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Т. о. загруженная свф не кастует, а использует класс из родительского домена. Если fully qualified classname и сигнатуры методов совпадают, то все ок.
Я правильно понимаю, что в случае с
Код AS3:
 загрузка идет в new ApplicationDomain(ApplicationDomain.currentDomain)
Дочерняя swf использует классы родительской, но не наоборот?
То есть, если я подгружаю несколько флешек с одинаковым документ-классом в одинаковом пакете (packageSwf.Main, например), но разным содержимым, никакого конфликта несовпавших сигнатур, относительно документ-класса первой загруженной swf, как в случае с
Код AS3:
_loader.load(new URLRequest(url), new LoaderContext(false, ApplicationDomain.currentDomain));
, не будет?
__________________
тут я

Старый 01.10.2012, 10:19
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от КорДум Посмотреть сообщение
никакого конфликта несовпавших сигнатур, относительно документ-класса первой загруженной swf, как в случае с
Код AS3:
_loader.load(new URLRequest(url), new LoaderContext(false, ApplicationDomain.currentDomain));
, не будет?
Похоже на то

If a child domain contains a certain definition with the same fully qualified name (name including its package path) as a definition in one of it's ancestor domains, the parent domains's definition will be referenced instead of the child's.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 01.10.2012, 10:23
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 5  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Это здорово и в моей ситуации чертовски удобно. Спасибо!
__________________
тут я

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

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

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


 


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


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