2014年2月10日月曜日

staticライブラリで追加したCategoryのメソッドがunrecognized selectorになる

staticライブラリにCategoryで既存クラスにメソッドを追加し、それを別プロジェクトでリンクしようとしたが、コンパイルは通るが実行時にunrecognized selectorでエラーとなる。
Objective-Cはダイナミックバインディングを行うため、個々のクラスにはリンカーシンボルが設定されるが、個々のメソッドには設定されない。スタティックライブラリでカテゴリにより既存クラスを拡張した場合、リンカーは関連づく基クラスのメソッドが分からず、このエラーとなる。
プロジェクトのBuild Settings/Linking/Other Linker Flagsに-ObjeCフラグを追加すると回避できる。

このオプションにより、当該ライブラリ中のObjective-Cのクラス/カテゴリが定義されているオブジェクトファイルが全てロードされる。
不要なものもロードされることになり、実行ファイルがフラグなし時より大きくなることが多い。
スタティックライブラリ中のクラス/メソッドの多くが必要な場合は問題ないでしょうが、ほんの一部しか利用しない場合は、ライブラリの構成を見直した方がよいでしょう。

参考: