NSMethodSignature、NSInvocation

NSMethodSignature

用於生成方法的返回值和參數的類型信息的記錄

示例代碼:

# 生成方法簽名
NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:"v@:"];

# 獲取對象方法的方法簽名
NSMethodSignature *signature = [[對象 class] instanceMethodSignatureForSelector:@selector(方法)];

# 獲取類方法的方法簽名
NSMethodSignature *signature = [[對象 class] methodSignatureForSelector:@selector(方法)];

可以通過斷點和po查看NSMethodSignature對象

<NSMethodSignature: 0x281e22430>
    number of arguments = 2
    frame size = 224
    is special struct return? NO
    return value: -------- -------- -------- --------
        type encoding (v) 'v'
        flags {}
        modifiers {}
        frame {offset = 0, offset adjust = 0, size = 0, size adjust = 0}
        memory {offset = 0, size = 0}
    argument 0: -------- -------- -------- --------
        type encoding (@) '@'
        flags {isObject}
        modifiers {}
        frame {offset = 0, offset adjust = 0, size = 8, size adjust = 0}
        memory {offset = 0, size = 8}
    argument 1: -------- -------- -------- --------
        type encoding (:) ':'
        flags {}
        modifiers {}
        frame {offset = 8, offset adjust = 0, size = 8, size adjust = 0}
        memory {offset = 0, size = 8}

也可以直接打印NSMethodSignature對象的屬性

NSLog(@"methodReturnType: %s", signature.methodReturnType);
for (int i = 0; i < signature.numberOfArguments; ++i) {
    NSLog(@"getArgumentTypeAtIndex: %d %s", i, [signature getArgumentTypeAtIndex:i]);
}
methodReturnType: v
getArgumentTypeAtIndex: 0 @
getArgumentTypeAtIndex: 1 :

NSInvocation

// 初始化
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

// 設置消息轉發的目標和方法
invocation.target = 對象;
invocation.selector = @selector(方法);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章