4

外部ライブラリまたはフレームワークを含める場合、Xcode のプロジェクト設定の他のリンカー フラグに「-ObjC」を含めます。その理由と、それを含めた場合の動作を教えてください。

前もって感謝します..

4

3 に答える 3

3

Appleの QA1490でかなりよく説明されています。

主な抜粋:

Objective-C は、各関数 (または Objective-C のメソッド) のリンカー シンボルを定義しません。代わりに、リンカー シンボルは各クラスに対してのみ生成されます。

...

この問題を解決するには、スタティック ライブラリに対するターゲット リンクで、リンカーに -ObjC オプションを渡す必要があります。このフラグにより​​、リンカーは、Objective-C クラスまたはカテゴリを定義するライブラリ内のすべてのオブジェクト ファイルをロードします。

于 2014-04-30T06:56:48.040 に答える
2

カテゴリは、このフラグの最もよく知られた使用例ですが (Apple の QA1490 で説明されているように)、このフラグが必要な唯一の理由ではありません。

Objective-C は、このようなことを可能にする動的言語であるためNSClassFromString()、実際に使用されているシンボルのみを含める (そして他のすべてのシンボルを破棄する) という C リンカの標準的な動作は機能しません。文字列を連結してからNSSelectorFromStringorを呼び出すなど、いくつかの間接的な方法で使用されますNSClassFromString

たとえば、xib/nib ファイルを考えてみましょう。これらはリンク段階には参加しませんが、この nib ファイル以外では参照されないライブラリ クラスをインスタンス化する場合があります。リンカーがこれらのクラスを未使用として破棄した場合、nib はロードできず、適切に動作しませんでした。

何も失われないようにする唯一の方法は、リンク時にライブラリからすべての Obj-C クラスを含めることです。このフラグはそれを行います。

于 2014-04-30T07:41:29.550 に答える