0

我的主应用程序 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;
}

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

4

1 回答 1

1

花了将近 12 个小时试图解决这个问题。终于找到了解决办法。为了避免我上面提供的运行时错误,您需要将单例类编译到 swc-library。而已。

就我而言,单例提供了对日志记录的全局访问,唯一的选择是从单例模式切换到静态类。但是我并不太想要它,因为我真的很喜欢这种单行单例实例化:“public static cosnt instance:MyClass = new MyClass();”。

于 2014-03-15T19:58:00.187 回答