天天看點

函數簽名與消息轉發:NSInvocation與NSMethodSignature

具體可見 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html

//規則: 傳回值 函數名: 具體參數個數 如 (NSString*)fun1:(NSString*)param1對應 “@@:@”,列印如下

<NSMethodSignature: 0x7a2dc790>

    number of arguments = 3

    frame size = 12

    is special struct return? NO

    return value: -------- -------- -------- --------

        type encoding (@) '@'

        flags {isObject}

        modifiers {}

        frame {offset = 0, offset adjust = 0, size = 4, size adjust = 0}

        memory {offset = 0, size = 4}

    argument 0: -------- -------- -------- --------

    argument 1: -------- -------- -------- --------

        type encoding (:) ':'

        flags {}

        frame {offset = 4, offset adjust = 0, size = 4, size adjust = 0}

    argument 2: -------- -------- -------- --------

        frame {offset = 8, offset adjust = 0, size = 4, size adjust = 0}

@property (readonly) NSUInteger numberOfArguments;

//參數個數

- (const char *)getArgumentTypeAtIndex:(NSUInteger)idx NS_RETURNS_INNER_POINTER;

//取參數類型

@property (readonly) NSUInteger frameLength;

- (BOOL)isOneway;

@property (readonly) const char *methodReturnType NS_RETURNS_INNER_POINTER;

//傳回值類型

@property (readonly) NSUInteger methodReturnLength;

//傳回長度

二、NSInvocation對原來簽名的方法執行新的方法,必須指定Selector和Target,invoke或invokeWithTarget執行

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

//類方法 生成簽名方法執行個體

@property (readonly, retain) NSMethodSignature *methodSignature;

//傳回包裝的簽名方法

- (void)retainArguments;

@property (readonly) BOOL argumentsRetained;

@property (nullable, assign) id target;

//傳回對象

@property SEL selector;

//傳回包裝的SEL

- (void)getReturnValue:(void *)retLoc;

//傳回簽名方法的傳回值

- (void)setReturnValue:(void *)retLoc;

//設定簽名方法的傳回值

- (void)getArgument:(void *)argumentLocation atIndex:(NSInteger)idx;

//傳回簽名方法的參數 index=2,取第一個參數

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

//設定簽名方法參數

- (void)invoke;

//執行方法

- (void)invokeWithTarget:(id)target;

//指定對象執行 相當于 setTarget和invoke

三 、NSObject類的方法

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector //中進行未定義方法的封裝

- (void)forwardInvocation:(NSInvocation *)anInvocation;//對封裝的方法進行調用

------------------越是喧嚣的世界,越需要甯靜的思考------------------

合抱之木,生于毫末;九層之台,起于壘土;千裡之行,始于足下。

積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千裡;不積小流,無以成江海。骐骥一躍,不能十步;驽馬十駕,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鳝之穴無可寄托者,用心躁也。