NSMethodSignature, NSInvocation原始碼分析

lazy_boy發表於2018-06-11
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;
複製程式碼

相關文章