Загрузка внешнего SWF использует старый код? - PullRequest
1 голос
/ 25 марта 2011

У меня проблема с запуском SWF в другом. Кажется, работает неверная версия кода. Вот объяснение окружающей среды.

a.swf (класс документа: ClassA ()) загружается в b.swf (класс документа: ClassB ()) с помощью типичных методов загрузки:

var _loader:Loader = new Loader();<br> addChild(_loader);<br> //add relevant event listeners...<br> _loader.load(new URLRequest("b.swf"))

Прямо сейчас, конструктор ClassB таков:
public function ClassB()<br> {<br> trace("ClassB() version 1.0");<br> }

Если я опубликую a.swf и b.swf, загрузив b.swf в a.swf, я получу трассировку «ClassB () версия 1.0»

Теперь, если я обновлю ClassB () до trace("ClassB() version 1.1") и только , опубликую b.swf, а затем запустите a.swf, я ожидаю, что на выходе будет «ClassB () version 1.1» однако это все еще "ClassB () версия 1.0"!

Я не уверен, что происходит.

a.swf определенно загружает новую версию b.swf (я изменил объекты на сцене в b.swf, который добавлен как потомок ClassA (), так что эти изменения показывают) ... но это все еще работает старая (1.0) версия кода ClassB. Я также проверил это, запустив b.swf сам по себе, и он показывает 1.1

Я могу заставить его запустить версию ClassB 1.1, если я также переиздаю a.swf

Первое, что я могу вспомнить, это то, что ClassA и ClassB используют один и тот же путь к классам, поэтому, когда я публикую a.swf, он содержит версию ClassB, которая была создана в то время (1.0), а затем запускает эта версия (вместо новой версии / 1.1 внутри b.swf). Это верно? Есть ли способ избежать этого, сохраняя их на том же пути класса? Или проблема в другом?

Заранее спасибо!

1 Ответ

2 голосов
/ 27 марта 2011

Это возможно, если A.swf имеет скомпилированную копию ClassB.По умолчанию B.swf будет загружен в дочерний элемент A ApplicationDomain.Это означает, что если существует конфликтующее определение класса (в данном случае ClassB), то будет использоваться определение родителя .Если старая версия ClassB была также скомпилирована в A.swf, то эта версия класса будет использоваться.Это может легко произойти, если у файлов один и тот же путь к классам.

Как указывает Голиатон, проверьте, есть ли у вас ссылки на ClassB внутри A.swf - например, var foo:ClassB.Это приведет к тому, что ClassB будет скомпилирован в A.swf.Вы также можете проверить это в Flash IDE, установив флажок «Создать отчет о размере» в «Свойства публикации» -> Flash.

Возможно, вы, в любом случае, не хотите компилировать ClassB в A, если вы пытаетесьзагрузить ClassB динамически как модуль.Чтобы не компилировать ClassB в A.swf, вы можете явно указать компилятору не включать ClassB в A.swf.Вы можете сделать это, добавив -externs ClassB в командную строку mxmlc.Flash Builder, FlashDevelop и т. Д. Имеют эту опцию в свойствах проекта.

Кроме того, вы можете удалить все ссылки на ClassB в A.swf.Если вам нужно создать его экземпляр, сделайте это косвенно: new (_loader.contentLoaderInfo.applicationDomain.getDefinition("ClassB") as Class)

Вы также можете загрузить B.swf в отдельный отдельный ApplicationDomain: _loader.load(url, new LoaderContext(false, new ApplicationDomain()); Это приведет к тому, что конфликтующие определения будут существовать отдельно в своих собственных доменах..

...