0

LRResty API と独自のクラス、関数などを含む iOS スタティック ライブラリの作成に成功しました。ライブラリをテストするために、ライブラリ ヘッダー ファイルと一緒に新しい Xcode プロジェクトにコピーしました。この新しい Xcode プロジェクトでは、最終的に LRResty 関数 [LRRestyClient get:withBlock:] を呼び出す関数の 1 つを呼び出しました。これにより、例外 NSInvalidArguementException unrecognized selector sent to instance がスローされます。興味深いのは、関数 (静的ライブラリ内) を右クリックして「定義に移動」すると、関数定義がどこにあるかがわかります。

この例外は多くの理由でスローされる可能性があることを知っていますが、他に何が考えられるか知っていますか? この説明があいまいすぎる場合は、より多くの情報を提供していただければ幸いです。または、LRResty ライブラリを iOS スタティック ライブラリにうまくパッケージ化する方法を教えてください。次に、このプロセスを使用して、残りのソース ファイルをその中にパッケージ化します。

注: 私は静的ライブラリを作成するのが初めてなので、見落としている非常に単純なものである可能性があります。このチュートリアルに従って静的ライブラリを作成しました: http://www.icodeblog.com/2011/04/07/creating-static-libraries-for-ios/

助けに感謝します。

4

1 に答える 1

0

この問題は、カテゴリを使用する LRResty ライブラリの結果でした。この問題を修正するには、コンパイラ フラグ -ObjC と -all_load をビルド ターゲットの [その他のリンカー フラグ]セクションに追加する必要がありました。注: これらのコンパイラ フラグは、私が作成したライブラリを利用しているサンプル アプリに追加されました。したがって、私のライブラリを使用するアプリはすべて、これらのコンパイラ フラグを挿入する必要があります。

iOS スタティック ライブラリ内でのカテゴリの使用に関する詳細情報を次に示します。

Objective-C は各関数 (または Objective-C のメソッド) のリンカー シンボルを定義しません。代わりに、リンカー シンボルは各クラスに対してのみ生成されます。>categories を使用して既存のクラスを拡張する場合、リンカーは、コア クラスの実装のオブジェクト コードとカテゴリの実装を関連付けることを認識しません。これにより、結果のアプリケーションで作成されたオブジェクトが、カテゴリで定義されているセレクターに応答しなくなります。

この問題を解決するには、スタティック ライブラリに対するターゲット リンクで -ObjC オプションをリンカーに渡す必要があります。このフラグにより​​、リンカは >Objective-C クラスまたはカテゴリを定義するライブラリ内のすべてのオブジェクト ファイルをロードします。このオプションは通常、(アプリケーションに追加のオブジェクト コードが読み込まれるため) 実行可能ファイルが大きくなりますが、既存のクラスのカテゴリを含む効果的な Objective-C 静的ライブラリを正常に作成できます。

重要: 64 ビットおよび iPhone OS アプリケーションの場合、カテゴリのみを含みクラスを含まないスタティック ライブラリから -ObjC がオブジェクト ファイルをロードすることを妨げるリンカのバグがあります。>回避策は、-all_load または -force_load フラグを使用することです。

上記の情報は、このStackoverflowの回答から取得されました。

于 2013-02-26T20:40:54.503 に答える