その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

ビルド設定の "Other Linker Flags" に "-ObjC" を設定する意味

とある静的ライブラリ(拡張子.a)をリンクして使用しようとすると、実行時になぜか

unrecognized selector sent to class XXXX

とエラーが出るので、ビルド設定を見直したところ、"Other Linker Flags"(Xcode3.xで言えば「他のリンカフラグ」)に "-ObjC" を指定していないことが原因でした。


"-ObjC"、名前からしてXcodeで作成するプロジェクトならデフォルトで効いてそうな名前なので今までスルーしてました。
これを定義するしないでunrecognized selectorエラーが出るほど重要なフラグとは・・・


調べてみたら、わかりやすい解説がありました。


Cocoaの日々: Static Library (7) カテゴリを使う場合の注意点 "-ObjC" と "-all_load"

カテゴリが定義されている Static Library を使う場合、リンカフラグに "-ObjC" と "all_load" を設定する必要がある。リンカフラグを設定しない場合 "selector not recognized" 例外が発生しクラッシュする。

この問題は UNIXの Static library実装 と Objective-C の動的な性質の違いによって引き起こされるとのこと。この問題を回避する為にリンカフラグに "-ObjC" オプションを追加する。


というわけで、Static Libraryを使う場合で、何かしらの問題が出たら、Other Linker Flags設定を見直しましょう。