セレクタの呼び出し方

セレクタの呼び出し方をまとめました。

方法1 performSelectorを使う

簡単に呼び出せるのでおすすめですが、引数が2つまでのセレクタしか呼び出せません。

id _target = self;
SEL _selector = @selector(hogemethod:);

int tag = self.tag;
NSObject* retVal = [_target performSelector: _selector withObject:tag];
方法2 NSInvocationを使う

汎用的で攻守最強??でも冗長で面倒ですね。

NSMethodSignature* signature = [[_target class] instanceMethodSignatureForSelector: _selector];
if (signature)
{
     NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
     [invocation setTarget: _target];
     [invocation setSelector: _selector];

     //引数の設定 第1引数はindex=2となる
     [invocation setArgument:&tag atIndex:2];
       
     //セレクタの実行
     [invocation invoke];
       
     //戻り値を取得
     NSObject* retVal;
     [invocation getReturnValue:&retVal];      
}

他にも objc_msgSend を使う方法があるようですが、私は使った事がありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です