iOS Runtime
2020-05-27 本文已影响0人
爱吃麦子的鱼
Runtime背景
OC是基于C的一门面向对象的语言,C语言是一门面向过程的语言,面向对象的实现是通过C语言的一套API,runtime运行时实现的。runtime的核心是消息传递。
对象的结构
想要了解消息传递机制,需要先了解OC对象的结构。
OC对象的分类
- instance(实例对象)
主要存储成员变量的具体值
- class(类对象)
存储类的协议、属性、成员变量、实例方法
- meta_class(元类对象)
主要存储类方法
OC对象的结构
-
类对象的数据结构
struct objc_class的结构.png
-
实例对象、类对象、元类对象之间的关系
OC对象结构.png
在64bit之后,isa指针需要进行一次位运算才能计算出真实的地址。
isa、superclass总结

通过上图我们可以看出整个体系构成了一个自闭环。struct objc_object结构体实例它的isa指针指向类对象,类对象的isa指针指向了元类。super_class指针指向了父类的类对象。元类的super_class指针指向了父类的元类,那元类的isa指针又指向了自己。
instance调用对象方法的轨迹
isa找到class,方法不存在,就通过superclass找父类
class调用类方法的轨迹
isa找meta-class,方法不存在,就通过superclass找父类
Runtime消息传递
方法调用三个阶段
1、 消息发送:负责从类及父类的缓存列表及方法列表查找方法。
2、 动态解析:如果消息发送阶段没有找到方法,则会进入动态解析阶段,负责动态的添加方法实现。
3、 消息转发:如果也没有实现动态解析方法,则会进行消息转发阶段,将消息转发给可以处理消息的接受者来处理。
消息发送

动态解析

消息转发

Runtime应用
- 利用关联对象(AssociatedObject)给分类添加属性
- 遍历类的所有成员变量(修改textfield的占位文字颜色、字典转模型、自动归档解档)
- 交换方法实现(交换系统的方法)
- 利用消息转发机制解决方法找不到的异常问题