Objective-C 関数へのポインタの取得

以下の関数を呼び出すことにより
メソッドのSELオブジェクトから、関数へのポインタを取得することができます。

 // クラスメソッド、インスタンスメソッド兼用
- (IMP) methodForSelector: (SEL)aSelector

// インスタンスメソッド専用
- (IMP) instanceMethodForSelector: (SEL)aSelector 

IMP型の定義は下記のような関数へのポインタのtypedefになっています。

// id:呼び出し元オブジェクト 
// SEL:関数のセレクタ 
// ...:引数リスト
typedef id (*IMP)(id, SEL, ... );
// [obj method: param1 p2:param2 ]  通常の呼び出し
//関数へのポインタ経由の関数呼び出し。
SEL selector = @selector(method:p2: );           // セレクタの取得
IMP pfunc = [obj methodForSelector : selector ]; // 関数へのポインタの取得
pfunc(obj , selector,param1,param2 );            // 呼び出し

関数へのポインタ経由の呼び出しは通常のメソッド呼び出しより高速ですが、
通常の呼び出しでも十分速いので、
これを気にするより先にアルゴリズムの見直しなどを行ったほうが良いです。

呼び出し方法別の呼び出し速度ランキング
関数へのポインタ経由の呼び出し >通常の呼び出し > selector経由の呼び出し (performSelector)

広告

akatukisiden について

フリーランスプログラマ 使用言語はC++,C#とそのつなぎのC++/CLI 専門はクライアントアプリ開発
カテゴリー: iOS, Objective-C パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中