阅读 755

NSMethodSignature, NSInvocation源码分析

Tips
void 的字面意思是 "无类型",void * 则为 "无类型 指针"
void *可以指定任何类型的数据。
复制代码

NSMethodSignature

通过类型编码,构造一个方法签名,比如: @:* ,返回参数是id,传入参数是 char *,一般在 Objective-C 中类型编码返回值 第一个参数是返回值,第二个参数是 SEL。

+ (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;
复制代码

这个方法签名有多少个参数,第一第二个参数一个是 返回值,一个是 SEL

@property (readonly) NSUInteger numberOfArguments;
复制代码

通过idx索引得到第几个编码值

- (const char *)getArgumentTypeAtIndex:(NSUInteger)idx
复制代码

参数在栈上占用的字节数,这个数字随着应用程序运行的硬件体系结构而变化。

@property (readonly) NSUInteger frameLength;
复制代码

方法返回类型,字符串编码

@property (readonly) const char *methodReturnType;
复制代码

方法返回类型字节

@property (readonly) NSUInteger methodReturnLength;
复制代码

NSInvocation

一个 NSInvocation 对象包含: 一个 target, 一个 selector,参数和返回值(return value),每一个元素都能够被直接赋值,当 NSInvocation 对象被调用的时候,这个返回值被自动设置。

通过方法签名返回一个 NSInvocation 对象

+ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)sig;
复制代码

保留参数,它会将传入的所有参数以及 target 都 retain 一遍

- (void)retainArguments;
复制代码

判断接收者是否保留了参数,在调用 retainArguments 之前为 NO,调用之后为 YES

@property (readonly) BOOL argumentsRetained;
复制代码

设置消息调用者,target 也是发送消息的接收者

@property (nullable, assign) id target;
复制代码

设置要调用的消息

@property SEL selector;
复制代码

得到返回值和设置返回值,注意是无类型的指针

- (void)getReturnValue:(void *)retLoc;
- (void)setReturnValue:(void *)retLoc;
复制代码

通过索引设置或得到返回值

- (void)getArgument:(void *)argumentLocation atIndex:(NSInteger)idx;
- (void)setArgument:(void *)argumentLocation atIndex:(NSInteger)idx;
复制代码

调用方法

- (void)invoke;
- (void)invokeWithTarget:(id)target;
复制代码