4

プリローダーとメイン アプリケーション クラス (すべて AS3 / Flash CS4) の間のやり取りに関して、奇妙な動作が見られます。大まかに言えば、イベントの流れは次のとおりです。

  1. Preloader.swf は、メイン アプリである main.swf と、プリローダーによってさまざまな URL からオブジェクトに組み立てられるテキストと画像で構成されるカスタム オブジェクトのアセットの 2 つを読み込みます。

  2. 読み込みが完了すると、Preloader は main.swf を子として追加します。次にプリローダーが呼び出されます
    init(myCustomObject)
    myCustomObject は、ステップ 1 でプリローダーによってアセンブルされたオブジェクトへの参照であり、
    public function init(customObject:CustomObject):void)
    Main.as のメソッド シグネチャです。(Preload.as は Main を型 * のオブジェクトにキャストし、コンパイル時のエラーを恐れずに任意の関数を呼び出すことができるようにします。)

  3. Main.as は実際にはアプリケーション自体のコンテナーであるため、
    新しいアプリケーション (customObject);
    プリローダーによってアセンブルされた customObject への参照を渡し、それを子として追加します。

アプリケーションの実行時にメッセージをログに記録できるように、Thunderboltをインストールしました。手順 3 での Application オブジェクトのインスタンス化が問題の原因です。なんらかの理由で、 myMainApplication = new Application(customobj);Main.as のステートメントが素敵な#1009エラーをスローしています。これは通常、null ポインター参照または類似のものを示しています。

奇妙なことに、 にログを追加したところ、問題なくApplication.asへの参照を受け取っているようです。inのコンストラクターcustomObjectを呼び出すtoString()と、期待されるデータが正確に返されます。customObjectApplication

つまり、Main.as のステートメントmyMainApplication = new Application(customobj);は、成功と失敗を同時に行っているように見えます。何を与える?

4

5 に答える 5

1

私の推測では、アプリケーションドメイン間でのキャストであるため、タイプは同じファイルですが、各アプリケーションドメインのメモリでは、2つの別個の具象タイプです。これを回避する方法はたくさんあります。おそらく、子ドメインではなく兄弟アプリケーションドメインにロードすることから始めるか、キャストを気にせず、型指定されていないオブジェクトで問題の関数を明示的に呼び出します。

それが実際にこの問題である場合、 WeLoveAppDomainはある程度の助けになるはずです。私たちが解体するこの失敗を実証するために、可能な限り最小の例をまとめることができますか?

于 2010-02-10T04:18:43.473 に答える
0

もっとコードを見る必要があると思いますが、まずは「customobj」...どこで定義していますか? 他の場所では「customObject」を参照します。それはタイプミスですか?その正確なステートメントがエラーをスローしている場合、「customobj」はおそらく null です。

于 2010-02-07T02:24:25.393 に答える
0

FlexBuilder/FlashDevelop またはフラッシュ IDE を使用していますか? また、プリローダーはどのように設定していますか?

FlexBuilder/FlashDevelop でアプリをビルドする場合、コンパイラ オプションでフレーム開始を指定しましたか?

于 2010-02-13T11:18:27.580 に答える
0

myMainApplication = new Application(customobj);成功と失敗が同時に発生しているように見えたのは、AS3 でブロックが動作する方法を完全に理解していなかったためですtry/catch。のコンストラクターへのサブルーチンでスローされるヌル ポインター例外がありました。この例外は、customobj への参照を受け取っていることを確認するためApplicationのコードの後に​​発生します。このエラーは、 inのインスタンスを囲むブロックApplicationによってキャッチされていました。これは、最も近くにあるエラー チェック コードを囲むためです。try/catchApplicationMain

うまくいけば、私の間違いが他の誰かが同様のものを作るのを救うでしょう!

于 2010-02-18T15:45:41.197 に答える
0

Flash Player のグローバル セキュリティ設定で、ディレクトリへのローカル アクセスが許可されていることを確認してください。

これを試して。パブリッシュ設定 - ローカル再生セキュリティに移動し、「ネットワークのみにアクセス」を選択します。Flash CS4 のデフォルトは「ローカル ファイルのみにアクセス」ですが、これは好ましくない場合があります。これが役に立つことを願っています。

参照: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html

于 2010-02-03T21:25:32.927 に答える