1,runtime基本知识点:
- RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。
- 对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。
- 对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言调用未实现的函数 在编译阶段就会报错)只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
2,runtime常见作用:
- 动态的添加对象的成员变量和方法
- 动态交换两个方法的实现
- 拦截并替换方法
- 在方法上增加额外功能
- 实现NSCoding的自动归档和解档
- 实现字典转模型的自动转换
3,runtime 代码实现时⚠️:
(要使用runtime,要先引入头文件#import <objc/runtime.h>
)
- 方法调用的本质,就是让对象发送消息。
objc_msgSend,
只有对象才能发送消息,因此以objc开头.- 使用消息机制前提,必须导入
#import <objc/message.h>
4,runtime的实现:
- 我们写的oc代码,它在运行的时候也是转换成了runtime方式运行的,更好的理解runtime,也能帮我们更深的掌握oc语言。每一个oc的方法,底层必然有一个与之对应的runtime方法。
- 当我们用OC写下这样一段代码:
-
[tableView cellForRowAtIndexPath:indexPath];
-
在编译时RunTime会将上述代码转化成[发送消息]
objc_msgSend(tableView, @selector(cellForRowAtIndexPath:),indexPath);
5,面试题(什么是runtime)
1>OC 是一个全动态语言,OC 的一切都是基于 Runtime 实现的
平时编写的OC代码, 在程序运行过程中, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者
比如:
2>runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API
3>runtimeAPI的实现是用 C++ 开发的(源码中的实现文件都是mm),是一套苹果开源的框架
6,阅读指引
iOS runtime机制详解(内含代码案例)https://blog.csdn.net/wks_lovewei/article/details/80551125
iOS runtime的使用 https://www.jb51.net/article/89441.htm
iOS runtime的原理及使用 https://www.cnblogs.com/allencelee/p/7573627.html