“装载机”中的类型强制失败了#39;并且'加载'应用

时间:2014-03-15 10:50:55

标签: actionscript-3 flash loader applicationdomain securitydomain

我的主应用程序swf文件正由一个简单的加载器swf应用程序加载,该应用程序可用于中断缓存。在这两个应用程序中,我希望能够访问单例。我将为您提供重现该错误的示例。所以这是我们的单身人士:

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

在loader和main类的构造函数中,我调用:

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;
}

然后就没有这样的错误,一切都会好的。很明显,Flash播放器在这里表现出一些意想不到的行为。关于这个问题的信息非常少。由于缺少加载器上下文,大多数人都会收到此错误,但正如我之前所说的,情况并非如此。关于这一点的一些讨论甚至没有任何答案,这对我来说很奇怪,因为我发现这是使用小型applcation加载器时遇到的一个常见问题。

1 个答案:

答案 0 :(得分:1)

花了将近12个小时试图解决问题。终于找到了解决方案。为了避免上面提到的运行时错误,你需要将你的单例类编译成swc-library。就是这样。

在我的情况下,singleton提供了对日志记录的全局访问,只有选项是从singleton模式切换到静态类。但我并不是非常想要它,因为我非常喜欢这种单行单例实例化:"公共静态cosnt实例:MyClass = new MyClass();"。