私のメイン アプリケーションの 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 インスタンスを作成し、現在の ApplicationDomain と SecurityDomain の両方を提供する LoaderContext を作成します。
しかし、ローダー アプリケーションを起動すると、次のエラーが表示されます。
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;
}
その後、そのようなエラーは発生せず、すべて問題ありません。明らかに、ここでフラッシュ プレーヤーが予期しない動作を実行しています。この問題に関する情報はほとんどありません。ほとんどの人は、ローダー コンテキストが欠落しているためにこのエラーを受け取りますが、前にここで述べたように、そうではありません。これに関するいくつかの議論は、小さなアプリケーションローダーを使用するときに遭遇する非常に一般的な問題であることがわかっているため、私にとっては奇妙なことです。