我的主应用程序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加载器时遇到的一个常见问题。
答案 0 :(得分:1)
花了将近12个小时试图解决问题。终于找到了解决方案。为了避免上面提到的运行时错误,你需要将你的单例类编译成swc-library。就是这样。
在我的情况下,singleton提供了对日志记录的全局访问,只有选项是从singleton模式切换到静态类。但我并不是非常想要它,因为我非常喜欢这种单行单例实例化:"公共静态cosnt实例:MyClass = new MyClass();"。