Ошибка приведения типа в приложениях "загрузчик" и "загружен"

Мой основной SWF-файл приложения загружается простым SWF-приложением-загрузчиком, которое полезно для разрушения кэша. В обоих приложениях я бы хотел иметь доступ к синглтону. Я предоставлю вам пример, чтобы воспроизвести ошибку. Итак, вот наш синглтон:

package {
    public class SingletonTest {
        public static const instance:SingletonTest = new SingletonTest();
        public function SingletonTest() { /* Nothing here. */ }
        public function test():void {
            trace("SingletonTest!");
        }
    }
}

В конструкторах как загрузчика, так и основных классов я называю:

SingletonTest.instance.test();

Это сделано для того, чтобы быть уверенным, что мой синглтон-код класса будет включен в оба приложения. Я не буду предоставлять вам код загрузчика, но это очень просто. Он создает экземпляр Loader, создает LoaderContext, предоставляя ему как текущий ApplicationDomain, так и SecurityDomain и т. Д.

Но когда я запускаю приложение-загрузчик, я получаю следующую ошибку:

Main Thread (Suspended: TypeError: Error #1034: Type Coercion failed: 
cannot convert SingletonTest@47a3091 to SingletonTest.) 
    SingletonTest$cinit 

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

public static const instance:SingletonTest = new SingletonTest();

Я напишу:

private static var _instance:SingletonTest;
public static function get instance():SingletonTest {
    if (_instance == null) _instance = new SingletonTest();
    return _instance;
}

Тогда не будет такой ошибки и все будет хорошо. Очевидно, что флеш-плеер выполняет некоторые неожиданные действия здесь. Там очень мало информации по этому вопросу. Большинство людей получают эту ошибку из-за отсутствия контекста загрузчика, но, как я уже говорил, это не так. Некоторые обсуждения по этому вопросу даже остаются без каких-либо ответов, что странно для меня, потому что я считаю, что это довольно распространенная проблема, возникающая при использовании небольшого загрузчика приложений.

1 ответ

Решение

Потратил почти 12 часов, пытаясь решить проблему. Наконец-то нашел решение. Чтобы избежать ошибки времени выполнения, которую я предоставил выше, вам нужно скомпилировать ваш синглтон-класс в swc-библиотеку. Вот и все.

В моем случае этот синглтон предоставлял глобальный доступ к журналу, и единственным вариантом было переключение с одноэлементного шаблона на статический класс. Но я не очень этого хотел, потому что мне действительно нравится этот однострочный одиночный экземпляр: "public static cosnt instance:MyClass = new MyClass();".

Другие вопросы по тегам