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源码分析相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  3. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  4. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  5. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  6. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  7. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  8. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  9. [转]slf4j + log4j原理实现及源码分析

    slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html

  10. Spark源码分析之七:Task运行(一)

    在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...

最新文章

  1. MySQL-数据库三大范式
  2. c# 自然序号,在C#中的自然排序
  3. mysql left day 7_day7-mysql函数
  4. 文献学习(part44)--Aberrance suppresse dspatio-temporal correlation filters for visual object tracking
  5. 解析Infopath生成的XSN结构
  6. P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】
  7. phoneinfo界面翻译_phone info +下载-三星验机神器phone info samsung下载v3.6.4 安卓版-西西软件下载...
  8. 对xml文件的增删改查及读写
  9. sip协议的功能及其应用
  10. Effective C++ 条款 50:了解new和delete的合理替换时机
  11. 【bzoj1022】[SHOI2008]小约翰的游戏John 博弈论
  12. google 插件_Google浏览器常用插件与使用小技巧
  13. JAVA之JAR文件
  14. 用slub track调试use after free问题
  15. Solaris系统环境变量声明方法
  16. 实验1 JavaEE开发环境配置与基础练习(JSP)
  17. html a4页面样式_4个使用将HTML转换为PDF的方法介绍-js教程
  18. 家谱编修制作软件修十大优势
  19. ps显示暂存盘已满的解决办法
  20. 信创云:打造自主可控云基础设施 | 厂商征集

热门文章

  1. 怎样在安卓中实现在锁屏状态下弹出对话框,并可以震动和铃声,就像闹钟似的?...
  2. Java核心技术读书笔记(2013-01-11)
  3. 一个用户在同一时间只能登录一次
  4. WordPress的wp-cumulus插件------------标签云插件
  5. 近年来最流行网络词汇及论坛用语
  6. ASP.NETSpring.NETNHibernate最佳实践(七)——第3章人事子系统(4)人事子系统小结...
  7. MFC(VS2010)编程实例之一(Edit Control控件)
  8. Morevec算子特征提取 opencv C++ CSU
  9. 【python|opencv】cv2.imread返回None,无法正确读取图片
  10. 机器学习第二回总结——多变量线性回归