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。
网友评论