Objective-C

転送の例

Appleのランタイムでは、セレクタに対応する引数情報と転送処理の二つの過程を経て行われる。
// NSMethodSignatureはメソッドの引数の数や型情報を表すオブジェクト
// Objective-Cのメソッドはスカラー型をとるC関数互換なので正確なスタック情報が必要となる
- (NSMethodSignature*)methodSignatureForSelector:(SEL)sel {
    id signature = [otherObj methodSignatureForSelector: sel];
    return signature;
}

// NSInvocationはターゲットと引数を持ち、返値を受け取るオブジェクト
// 元のターゲットの代わりに別のターゲットで実行を行なうとあたかもそのオブジェクトにメッセージが送られたかのように動作する

- (void)forwardInvocation:(NSInvocation*)invocation {
    SEL aSel =  [invocation selector];
    if([otherObj respondsToSelector: aSel]) {
        [invocation invokeWithTarget: otherObj];
    } else {
        [self doseNotRecognizeSelector: aSel];
    }
}

戻る