まえがき
UIView などの既存のクラスにメソッドを追加するにはカテゴリを使うのが一般的(参考:http://news.mynavi.jp/column/objc/008/index.html)。 あるいは全く異なる機能を持たせたいならオーバーライドする。 では、既存のメソッドの機能を残しつつ、そこに独自の機能を追加したい場合はどうするか。一番スマートなのはサブクラスを作成して対処する方法。じゃあ、「サブクラス」なんか作りたくない、という時はどうするか。Delegate などで対処できないかよく考慮した上で、ダメなら自分で作ったメソッドと置き換えてしまおう。runtime.h
runtime.h ヘッダーにはmethod_exchangeImplementationsというメソッドを置き換える関数が用意されている。 これとカテゴリによるメソッドの追加を組み合わせればメソッドに独自の機能を追加することができる。 - [UITableView reloadData] を reloadData2 で置き換えてみよう。まずは reloadData2 を用意する。1 2 3 4 5 6 7 8 9 | - ( void )reloadData2 { [ self reloadData2]; SEL selector = @selector (tableViewDidEndReloadingData:); if ( self .delegate && [ self .delegate respondsToSelector:selector] ){ [ self .delegate performSelector:selector withObject: self ]; } } @end |
1 2 3 4 5 6 7 | #import <objc/runtime.h> static void UITableViewReplaceReloadDataMethod ( void ) { Method original = class_getInstanceMethod([ UITableView class ], @selector (reloadData)); Method replace = class_getInstanceMethod([ UITableView class ], @selector (reloadData2)); method_exchangeImplementations(original, replace); } |