本文主要梳理iOS Runtime 核心知识
- 数据结构
- method_t
- 类对象与元类对象
- 方法缓存
- 消息传递
- 消息转发
- Method-Swizzling
- 动态添加方法
- 动态方法解析
Runtime 数据结构
1.objc_class
2.isa 指针
结构
isa指针主要分为几种
- 共用体isa
- 指针型isa isa的值代表class的地址
- 非指针isa isa的值部分代表class的地址
isa指向
关于对象,指向其类对象 关于类对象,其指向元类对象
method_t
是个结构体,包含了函数四要素(名称 返回值 参数 函数体)
类对象与元类对象
方法缓存
runtime是如何通过Selector找到对应的Imp地址的
1.cache 中查找
hash 查找 给定值是sel,目标是对应的bucket_t的imp
2.当前类中查找
已排序好的列表,二分查找方法对应执行函数
没有排序的,一般遍历查找方法对应执行函数
3.父类逐级查找
消息传递
1.缓存是否命中
2.当前类方法列表是否命中
3.逐级父类方法列表是否命中
4.消息转发流程
消息转发
4步骤
Method-Swizzling
方法交换 hook
动态添加方法
动态方法解析
参考文章:
runtime
yulingtianxia.com/blog/2014/1…
消息转发机制原理