NSMethodSignature, NSInvocation源码分析
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;
复制代码
NSMethodSignature, NSInvocation源码分析相关推荐
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- Yolov3Yolov4网络结构与源码分析
Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
- MyBatis原理分析之四:一次SQL查询的源码分析
上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码 String res ...
- [转]slf4j + log4j原理实现及源码分析
slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html
- Spark源码分析之七:Task运行(一)
在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...
最新文章
- MySQL-数据库三大范式
- c# 自然序号,在C#中的自然排序
- mysql left day 7_day7-mysql函数
- 文献学习(part44)--Aberrance suppresse dspatio-temporal correlation filters for visual object tracking
- 解析Infopath生成的XSN结构
- P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】
- phoneinfo界面翻译_phone info +下载-三星验机神器phone info samsung下载v3.6.4 安卓版-西西软件下载...
- 对xml文件的增删改查及读写
- sip协议的功能及其应用
- Effective C++ 条款 50:了解new和delete的合理替换时机
- 【bzoj1022】[SHOI2008]小约翰的游戏John 博弈论
- google 插件_Google浏览器常用插件与使用小技巧
- JAVA之JAR文件
- 用slub track调试use after free问题
- Solaris系统环境变量声明方法
- 实验1 JavaEE开发环境配置与基础练习(JSP)
- html a4页面样式_4个使用将HTML转换为PDF的方法介绍-js教程
- 家谱编修制作软件修十大优势
- ps显示暂存盘已满的解决办法
- 信创云:打造自主可控云基础设施 | 厂商征集
热门文章
- 怎样在安卓中实现在锁屏状态下弹出对话框,并可以震动和铃声,就像闹钟似的?...
- Java核心技术读书笔记(2013-01-11)
- 一个用户在同一时间只能登录一次
- WordPress的wp-cumulus插件------------标签云插件
- 近年来最流行网络词汇及论坛用语
- ASP.NETSpring.NETNHibernate最佳实践(七)——第3章人事子系统(4)人事子系统小结...
- MFC(VS2010)编程实例之一(Edit Control控件)
- Morevec算子特征提取 opencv C++ CSU
- 【python|opencv】cv2.imread返回None,无法正确读取图片
- 机器学习第二回总结——多变量线性回归