2005年09月15日
メソッドのポインタ
http://decomo.info/wiki/blog/2005/2005-09-15に移行しました。
メソッドのポインタを取得して、メソッドをCの関数として呼び出す事が出来るのだとか。
// イニシャライズ
id obj = [Hogehoge new] ;
// メソッドのセレクタ取得
SEL method = @selector(methodOfHogehoge);
// セレクタからメソッドのポインタ取得
IMP func = [Hogehoge instanceMethodFor:method];
// 関数としてメソッド methodOfHogehoge を実行
func(obj, method);
id obj = [Hogehoge new] ;
// メソッドのセレクタ取得
SEL method = @selector(methodOfHogehoge);
// セレクタからメソッドのポインタ取得
IMP func = [Hogehoge instanceMethodFor:method];
// 関数としてメソッド methodOfHogehoge を実行
func(obj, method);
肝となるのは、instanceMethodFor: メソッド。こいつが、セレクタ(メソッドの内部識別子)から、そのセレクタが表すメソッドのポインタを探し出してくれる。その返り値を、IMP型のポインタで受け取ると、あら不思議、Cの関数呼び出しの形でObjective-Cのメソッドが実行できちゃった。ただし、引数として、元のメソッドが含まれるオブジェクトと、メソッドのセレクタを渡してやらないといけない。
とりあえず、Objective-Cの勉強は一段落したが、俯瞰してみると、Objective-Cが「Cの枠組みの中でオブジェクト指向を目指した言語」であるということが、よくわかる。そのお陰か、Cの流れを汲んだオブジェクト指向言語であるC++と比べて、言語規模は格段に小さい(と思う)。
表記方法がかなり特殊ではあるが、初心者がオブジェクト指向を学ぶには、Objective-Cは結構いい言語なのでは?と思ったりした。
Decomo | 20:02