![]() |
Загружаемая флешка и дочерний аппдомен
Потребовалось сделать многоSWFочное приложение, состоящее из кучи "модулей". Модули имели свои интерфейсы, я их грузил в дочерний аппдомен, чтобы можно было приводить swf к этим интерфейсам.
А тут что-то смотрю: утечки памяти. начал копать, оказалось, что это баг плеера (иначе это не назвать). При Loader#unloadAndStop() загруженная флешка удалялась, да не совсем: профайлер (на трех проверил даже) показывал, что все экземпляры подгружаемой флешки остаются в памяти и постоянно копятся. Постоянно. Не чистятся GC вообще. В итоге я отказался от интерфейсов и дочернего аппдомена, начал использовать Object на свой страх и риск. А тут что-то смотрю, вызываю у swf метод, передаю в нем массив с кастомными экземплярами классов, а они на том конце успешно подхватываются, кастуются к аналогичным классам подгруженной swf и свойства с методами доступны... Начал проводить эксперименты. Интерфейс заработал. И GC успешно чистит из памяти весь хлам. То есть загрузка вида Код AS3:
Код AS3:
Как это работает? Объясните, пожалуйста. |
Цитата:
Если обращаются к классам, существующим и в дочернем(-них) и в родительском домене, то используется класс из самого верхнего родительского домена. "Перетирания" не происходит. Вызвать класс из дочернего домена можно путем обращения к этому домену super.loaderInfo.applicationDomain.getDefinition(); Т. о. загруженная свф не кастует, а использует класс из родительского домена. Если fully qualified classname и сигнатуры методов совпадают, то все ок. Проведите эксперименты комбинируя одинаковое class local name в fully qualified classname и разные/совпадающие namespace, а также разные/совпадающие method signature. Если будете загружать в ApplicationDomain.currentDomain, являющийся дочерним по отношению к system domain, то код практически никогда из него не выгрузится, т.к. минимальным квантом выгрузки является сам домен. А это теоретически может произойти, если будет выгружены все дочерние по отношению к currentDomain свф, и сам документ класс. Сомневаюсь в возможности его выгрузки. |
Цитата:
Код AS3:
То есть, если я подгружаю несколько флешек с одинаковым документ-классом в одинаковом пакете (packageSwf.Main, например), но разным содержимым, никакого конфликта несовпавших сигнатур, относительно документ-класса первой загруженной swf, как в случае с Код AS3:
|
Цитата:
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. |
Это здорово и в моей ситуации чертовски удобно. Спасибо!
|
| Часовой пояс GMT +4, время: 17:38. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.