Безопасность Flash / AS3 - передача ссылки на мувиклип для дочернего SWF? - PullRequest
4 голосов
/ 26 января 2010

Я вижу странное поведение в отношении взаимодействий между моим предзагрузчиком и основными классами приложений (все AS3 / Flash CS4). Грубо говоря, вот поток событий:

  1. Preloader.swf загружает две вещи: main.swf, которое является основным приложением, и ресурсы для пользовательского объекта, состоящего из текста и изображений, которые встраиваются в объект предварительным загрузчиком из различных URL-адресов.

  2. Когда загрузка заканчивается, Preloader добавляет main.swf как дочерний элемент. Затем Preloader вызывает
    init(myCustomObject)
    для main.swf, где myCustomObject является ссылкой на объект, собранный предварительным загрузчиком на шаге 1, а
    public function init(customObject:CustomObject):void)
    является сигнатурой метода в Main.as. (Preload.as приводит Main к объекту типа *, чтобы иметь возможность вызывать произвольные функции, не опасаясь ошибок во время компиляции.)

  3. Main.as на самом деле является контейнером для самого приложения, поэтому он создает экземпляр
    new Application(customObject);
    , передающий ссылку на customObject, собранный предварительным загрузчиком, и добавляет его как дочерний элемент.

Я установил Thunderbolt , чтобы я мог регистрировать сообщения при запуске приложения, и вот что я определил, что происходит. Создание экземпляра объекта Application в шаге 3 - это то, что вызывает проблемы; по какой-то причине, заявление myMainApplication = new Application(customobj); в Main.as выдает прекрасную ошибку #1009, которая обычно указывает на нулевую ссылку на указатель или что-то подобное.

Странно то, что я добавил некоторые записи в Application.as и, похоже, без проблем получает ссылку на customObject; вызов toString() в конструкторе customObject в Application возвращает именно ожидаемые данные.

Другими словами, утверждение myMainApplication = new Application(customobj); в Main.as кажется успешным и неуспешным одновременно. Что дает?

Ответы [ 5 ]

1 голос
/ 10 февраля 2010

Я предполагаю, что ваше преобразование осуществляется через домены приложения, поэтому, хотя типы являются одинаковыми файлами, в памяти каждого домена приложения они представляют собой 2 отдельных конкретных типа. Есть много способов обойти это, возможно, начиная с загрузки в дочерний домен приложения, а не дочернего домена, или не заморачиваясь с приведением и явно вызывая соответствующую функцию для нетипизированного объекта.

WeLoveAppDomain должен оказать некоторую помощь, если это на самом деле эта проблема. Можете ли вы собрать наименьший возможный пример, чтобы продемонстрировать эту неудачу для нас, чтобы разобрать?

0 голосов
/ 18 февраля 2010

Причина, по которой myMainApplication = new Application(customobj); казался успешной и неудачной одновременно, заключается в том, что я не до конца понял, как блоки try/catch работают в AS3. Возникла исключительная ситуация нулевого указателя в подпрограмме для конструктора Application, возникающая после кода, в котором Application проверяет, получает ли она ссылку на customobj. Эта ошибка обнаруживалась блоком try/catch, окружающим экземпляр Application в Main, так как это был ближайший код проверки ошибок.

Надеюсь, моя ошибка спасет кого-то другого за создание подобной!

0 голосов
/ 13 февраля 2010

Используете ли вы FlexBuilder / FlashDevelop или flash IDE?Кроме того, как вы настраиваете Preloader?

Если вы собирали свое приложение с помощью FlexBuilder / FlashDevelop, указали ли вы начало фрейма в опциях компилятора?

0 голосов
/ 07 февраля 2010

Я думаю, нам нужно увидеть больше кода, но для начала: "customobj" ... где вы это определяете? Вы ссылаетесь на "customObject" везде. Это опечатка? Если это точное определение выдает ошибку, то, скорее всего, «customobj» будет нулевым.

0 голосов
/ 04 февраля 2010

Убедитесь, что ваши глобальные параметры безопасности в Flash Player разрешают локальный доступ к каталогу.

Попробуй это. Перейдите в «Параметры публикации» - «Безопасность локального воспроизведения» - выберите «Доступ только к сети». Flash CS4 по умолчанию «Доступ только к локальным файлам», что может не понравиться. Я надеюсь, что это полезно.

См: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html

...