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;
複製程式碼