[ SPECIAL ]

Xcode4

静的ライブラリ内のカテゴリされたメソッドが呼び出せない

2011/08/25 Tomohiro Kumagai

□ 静的ライブラリに格納したメソッドを呼び出したときにエラーが発生する。

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" で登録しただけでは、上手く呼び出せないような感じです。

Link Binary With Libraries で取り込んだだけでは、カテゴリされたメソッドを呼び出す際にエラーとなるようです。

ちなみに、カテゴリされたメソッドについては カテゴリ機能を使用して独自メソッドを追加する に記していますので、必要に応じてこちらも参考にしてください。

 

静的ライブラリ内に定義されたカテゴリされたメソッドを正しく呼び出せるようにするためには、プロジェクトの "Build Settings" から、"Linking" グループにある "Other Linker Flags" に "-ObjC -all_load" を設定する必要があるようでした。

カテゴリされたメソッドを静的ライブラリから呼び出すために、Other Linker Flags に "-ObjC -all_load" を追加します。

こうすることで、静的ライブラリ内にあるカテゴリされたメソッドが、リンク先のバイナリにも組み込まれ、実行時にそのメソッドを正しく呼び出すことができるようになりました。

 


 

カスタム検索

copyright © Tomohiro Kumagai @ EasyStyle G.K.
contact me: please from mail-form page.