函数签名与消息转发: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
最新文章
- HDU 2045 不容易系列之(3)―― LELE的RPG难题(递推)
- 分享一下自己用c++写的小地图
- strftime 日期时间格式化
- spring mvc 深入学习
- linux学习之-vsftp
- asp.net 之
- php array转json、xml
- IE9 不F12打开控制台,代码不执行。打开后正常
- PHP cURL应用实现模拟登录与采集使用方法详解
- centos python nginx uwsgi
- ORACLE 检查数据库表中是否存在不规范字 段的语句参考.sql
- linux扩展lvm磁盘
- Keil C51库函数原型列表
- feof()和EOF的用法(转载)
- InPageError c000009c使用chkdsk修复磁盘
- Android 根据规划 Touch 分配和消费机制的事件
- java中难度大一点的面试题
- ReactiveSwift源码解析(六) SignalProtocol的take(first)与collect()延展实现
- 【redis】redis配置文件参数解析
- Deepin 15.4 安装 Double Commander
热门文章
- css3子级高度与父级同高,内容垂直居中
- 「JavaSE 重新出发」05.03 反射
- 从Dinnr失败看产品市场可行性认知有哪些不足
- swift使用查阅资料备份4
- Unity 自己旋转 方法
- POST和GET详解
- BZOJ 4817 [SDOI2017]树点涂色 (LCT+线段树维护dfs序)
- 为什么在index.jsp里面引入了common.js,在item-add.jsp以及其他一些jsp文件里面就不需要引入common.jsne ?
- fensorflow 安装报错 DEPENDENCY ERROR
- Image Processing for Very Large Images