NSMethodSignature|NSInvocation

A record of the type information for the return value and parameters of a method.
记录一个方法的返回值类型信息和参数类型信息。

初始化方法:

//获取实例方法的签名
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
//获取类方法的签名
+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector;
+ (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;

如何获取Block类型的方法的签名?
请参照(Aspect)

static NSMethodSignature *aspect_blockMethodSignature(id block, NSError **error)

ObjCTypes

在OC中,每一种数据类型可以通过一个字符编码来表示(Objective-C type encodings)

NSInvocation

步骤1 生成

+ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)signature ;

步骤2 设置参数

- (void)setArgument:(void *)argumentLocation atIndex:(NSInteger) index;

情况1:如果步骤1中的signature是从SEL生成,那么参数设置要从index =2开始,因为有两个隐藏参数(self,_cmd)已经占用了index=0和index=1。
情况1:如果步骤1中的signature是从Block生成,那么参数设置要从index =1开始,因为隐藏参数(self)占用了index=0。
步骤3 调用

- (void)invoke;
- (void)invokeWithTarget:(id)target;

步骤4 获取返回值

- (void)getReturnValue:(void *)retLoc

应用场景

1、扩展系统 performSelector系列方法
2、方法转发第三步 转发方法 封装为 NSInvocation
3、命令模式 利用NSInvocation封装为命令 在适当的时机invoke。

你可能感兴趣的:(NSMethodSignature|NSInvocation)