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(方法);