統計情報(30日間)


最新情報をツイート


人気の投稿

動的にメソッド追加できるライブラリ REKit

このエントリーをはてなブックマークに追加

メソッドをblocksとしてインスタンス単位で登録・上書き出来るアイディアは面白い。



日本語Readme


日本語の紹介ページあり。


REKit は、iOS, OS X の開発で使える NSObject の拡張コレクションです。現時点では Blocks の潜在能力を引き出すような 2つ の機能を提供しています:

REResponder: Block を使ったインスタンスの動的メソッド実装/上書き機能
REObserver: Block を使って KVO (Key-Value Observing) を実現する機能 + α

面白いのはメソッドの実体をblocksとして渡せるところ。これは良いアイディア。クラスではなくインスタンスにメソッドを登録できるというところがミソ(カテゴリではインスタンス単位での追加はできない)。また既存メソッドの上書きができるので、テスト時のモックコードを書くなんてこともできる。

こんな感じで特定のインスタンスに新しいメソッドを追加できる。
id obj;
obj = [[NSObject alloc] init];
[obj respondsToSelector:@selector(sayHello) withKey:nil usingBlock:^(id receiver) {
   NSLog(@"Hello World!");
}];
[obj performSelector:@selector(sayHello)]; // Hello World!
withKey: にキーとなるオブジェクトを渡せば、後々キーを使って登録blocksを管理することができる。nilを渡すと UUIDが割り当てられるとのこと。
登録するBlocksはスタック構造で管理されていて、同じセレクタにblocksを登録していくとそれらはスタックされる。この性質を使いオリジナルのメソッドを呼び出すこともできる。

活用例としていくつかの利用パターンが紹介されている。
・それ自身をデリゲートにする
・それ自身をターゲットにする
・UnitTest で、モックオブジェクトを用意する
・UnitTest で、ハイコストな処理をスタブ化する
・関心/機能をまとめる


また合わせてKVOをBlockで扱えるライブラリも提供されている。
REObserver は、KVO (Key-Value Observing) に以下の機能を付加する NSObject の拡張である:

・Block を使って KVO を実現する機能
・監視停止を簡潔にする機能
・自動で監視を停止する機能
こんな感じ。
id observer;
observer = [obj addObserverForKeyPath:@"someKeyPath" options:0 usingBlock:^(NSDictionary *change) {
    // Do something…
}];
監視停止はこの1行だけでいい。
[observer stopObserving];


動作環境
iOS 5.0 以降
OS X 10.7 以降

ライセンス
MIT ライセンス。詳細は LICENSE ファイルを参照。

- - - -
メソッド追加がblocksで出来るアイディアは面白い。Objective-Cの動的性質をうまく使って言語を拡張している感じを受けた。メソッドの追加自体はObjective-Cにも元々カテゴリがあるのでこのライブラリを使うメリットとしては、利用パターンにあるように面倒な定義(デリゲートなど)を書かなくて良くなることだと思われる。またインスタンス毎にメソッドを登録できるというのはカテゴリではできない。定義の代わりにコードでメソッドをインスタンス単位で登録できるので、そのメリットとして関連するコードをまとめやすくなる。特定のクラス・メソッドのblocks化を行うライブラリは良く見られるが、このライブラリ1つでそれらの多くをカバーできると思われる。



Leave a Reply