静的ライブラリ内のカテゴリされた関数が呼び出せない - Xcode4
SPECIAL
静的ライブラリに格納したメソッドを呼び出したときにエラーが発生する。
Xcode4 で静的ライブラリを作成して、別のアプリケーションから、その静的ライブラリ内に格納されているカテゴリされた関数を呼び出そうとしたところ、実行時のタイミングで、次のようなエラーが発生してしまいました。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSString stringExWithStringOrNil:]: unrecognized selector sent to class 0xbde6d0'
このエラーの中で注目するポイントは "unrecognized selector sent to class" で、つまりここでは "NSString" に対して実行を行った "stringExWithStringOrNil" というメソッドが存在しないというエラーです。
このメソッドは、Objective-C のカテゴリ機能を使って、NSString に独自にメソッドを追加したものなのですけれど、どうやらこれが静的ライブラリ内で定義されている場合には、単にライブラリを "Build Phases" の "Link Binary With Libraries" で登録しただけでは、上手く呼び出せないような感じです。
ちなみに、カテゴリされたメソッドについては カテゴリ機能を使用して独自メソッドを追加する に記していますので、必要に応じてこちらも参考にしてください。
静的ライブラリ内に定義されたカテゴリされたメソッドを正しく呼び出せるようにするためには、プロジェクトの "Build Settings" から、"Linking" グループにある "Other Linker Flags" に "-ObjC -all_load" を設定する必要があるようでした。
こうすることで、静的ライブラリ内にあるカテゴリされたメソッドが、リンク先のバイナリにも組み込まれ、実行時にそのメソッドを正しく呼び出すことができるようになりました。