函数签名与消息转发: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: -------- -------- -------- --------
        type encoding (@) '@'
        flags {isObject}
        modifiers {}
        frame {offset = 0, offset adjust = 0, size = 4, size adjust = 0}
        memory {offset = 0, size = 4}
    argument 1: -------- -------- -------- --------
        type encoding (:) ':'
        flags {}
        modifiers {}
        frame {offset = 4, offset adjust = 0, size = 4, size adjust = 0}
        memory {offset = 0, size = 4}
    argument 2: -------- -------- -------- --------
        type encoding (@) '@'
        flags {isObject}
        modifiers {}
        frame {offset = 8, offset adjust = 0, size = 4, size adjust = 0}
        memory {offset = 0, size = 4}

@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;//对封装的方法进行调用

 

http://blog.csdn.net/bigtiger1648/article/details/51084957

转载于:https://www.cnblogs.com/feng9exe/p/8384903.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值