2

2 つの静的ライブラリを参照しています。それらをデバッグ シミュレータ モードでビルドすると、すべてがアプリでうまく動作します。次に、debug-iphone ビルドを作成し、アプリをデバイスにプッシュします。このエラーで壊れます:

キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '*** -[NSCFString sizeWithCGFont:pointSize:constrainedToSize:]: 認識されないセレクターがインスタンス 0x24320 に送信されました'

その後、SIGABRT エラーが表示されます。

なぜこれがシミュレーターでうまく動作し、デバイスでしかマニフェストしないのでしょうか?

- 編集 -

最後に、少なくともデバイスで実行するための回避策を見つけましたが、現在はシミュレーターでは実行していません。例外をスローしているメソッドは、フォントに使用しているクラスです。これは、たとえば、問題が発生していたライブラリである staticLibA の一部です。ターゲット アプリと問題クラスの .m ファイルに参照として staticLibA を含めました。NSString のカテゴリであるヘッダー ファイルへの参照は既にありました。.m ファイルを含めるまで機能しなかったのはそのためですか?

シミュレーターで実行しようとすると、上記のクラスのビルド出力フォルダーで重複オブジェクト エラーが発生します。

4

3 に答える 3

2

なぜあなたの問題が現時点でデバイスにのみ現れているのかわかりませんでした-おそらく両方のビルドをクリーンアップして再コンパイルする必要がありますか?

いずれの場合も、表示される例外メッセージは完全に有効です。。という名前の(パブリック)メソッドはありません-[NSString sizeWithCGFont:pointSize:constrainedToSize:]。NSStringのsizeWithFont:メソッドの1つをどこかで呼び出そうとしていますか?

編集:sizeWithCGFont:pointSize:constrainedToSize:これはcocos-2dからのもののようです。これは、静的ライブラリの1つになると思います。シミュレーターとデバイスのビルドの主な違いは、ビルドのアーキテクチャーです。シミュレーターのアーキテクチャーは独自のマシン(i386)のアーキテクチャーですが、デバイスのビルドはarmv6またはarmv7用です。静的ライブラリが適切なアーキテクチャ用に構築されていることを確認しますか?

于 2009-11-23T16:32:13.410 に答える
0

お使いのコンピューターは x86 (または x86_64) アーキテクチャー上にあるため、シミュレーターのビルドは Intel プラットフォーム用にコンパイルされます。

デバイス ビルドは、arm6 (または arm7) アーキテクチャにコンパイルされます。

相互にコンパイルされたライブラリを使用することはできません。それぞれのアセンブリ コードには互換性がありません。

于 2009-11-23T16:43:47.850 に答える
0

オブジェクトを間違って解放していたときに、この問題が発生しました。したがって、割り当てられていないオブジェクトへのポインターがあります。そのため、オブジェクトで関数を呼び出すと、NSCFString オブジェクトで関数を呼び出していたことがわかります。おそらく、メモリが NSString オブジェクトに再利用されたためです。余分なリリースを見つけて削除することで修正しました。

于 2009-11-24T03:05:23.810 に答える