1. 什么是runtime?
对于Runtime,Apple官方给出的解释是:
The Objective-C runtime is a runtime library that provides support for the dynamic properties of the Objective-C language, and as such is linked to by all Objective-C apps.
我们都知道 Objective-C是一门动态语言,这意味着它不仅需要编译器,它还需要运行时系统来进行代码编译。而Runtime就执行了这一运行时系统代码编译工作。
Runtime直译就是运行时,是Apple用C和汇编语言编写的一套C语言的API,它正是 Objective-C这门动态语言的核心。我们知道计算机唯一能识别的语言是机器语言,高级编程语言不能被直接识别,需要先编译为汇编语言,再由汇编语言编译为机器语言才能被计算机识别。而 Objective-C语言不能被直接编译为汇编语言,它必须先编译为C语言,然后再编译为汇编语言。而Runtime正是编译器将我们写的 Objective-C代码编译为C语言时用到的核心库。
一句话总结:是由c,c++,汇编实现的一套api,是为了c进化到oc添加的运行时功能
2. runtime 分为2个版本:
legacy(2.0以前的)和 modern (2.0以后的)
3. 其实runtime的所有知识基本都围绕两个中心
1.类的各个方面的动态配置
2.消息传递
要动态配置类就需要知道类的本质是什么,详见我的另一篇博客 《类的底层原理》。
了解了类的结构,那么让我们看看runtime的源码(.h文件);其实所谓的runtime.h只是一组c语音的api,它用的c语言的语法,可以做一些OC做不到的功能。它们能在运行时可以执行获取类,初始化对象,赋值等等的操作,这也就是“动态配置”
4. 两个本质(面试题):
oc 对象的本质是一个结构体
方法的本质是发送消息(msg_send( id self, SEL _cmd ))
5. runtime 3种调用方式
1.runtime api 2.NSObjc api 3.objc 上层方法(@selector() )
runtime 3种调用方式
- runtime api
- NSObjc api
- objc 上层方法(@selector() )
6. msg_send 介绍和工作原理:

7. 消息转发流程:

8. instrumentObjcMessageSends 方法可以打印方法调用流程
- 在调用方法的前后开启和关闭

-
运行一下
-
在Macintosh HD/private/tmp 路径下找到编译的文件,里边就是输出的底层调用方法

网友评论