つい最近までiOS用のコードを書いていたのですが、その中でとあるオープンソースのライブラリを使用しています。でその中のとあるインスタンスメソッドの処理を書き換える必要がありました。
カテゴリ使って書き換えようと思ったのですが、その処理自身がカテゴリで定義されていたため無理でした。
まあライセンスに問題なければソースを直接修正すれば良いのですが、ライブラリのアップデートとかに備えておきたいとこです。
そこでclass_replaceMethodを使って書き換える方法に落ち着きました。
//ExampleClassのexampleMethodを書き換える例
#import
...
id class = [ExampleClass class];//クラス定義取得
SEL sel = @selector(exampleMethod);//セレクタ取得
void (^block)() = ^{
//処理を書き換える
};
IMP imp = imp_implementationWithBlock(block);//BlocksからIMPを生成
Method method = class_getInstanceMethod(class, sel);//元のインスタンスメソッドを取得
char* types = method_getDescription(method)->types;//インスタンスメソッドの引数の型を取得
class_replaceMethod(class, sel, imp, types); //書き換え!
これをAppDelegateなんかで実行しておけばOKです。