iOS Runtime

56 阅读1分钟

1f4ce094cc33d1f03f59588c71aefec1.jpg

本文主要梳理iOS Runtime 核心知识

  1. 数据结构
  2. method_t
  3. 类对象与元类对象
  4. 方法缓存
  5. 消息传递
  6. 消息转发
  7. Method-Swizzling
  8. 动态添加方法
  9. 动态方法解析

Runtime 数据结构

1.objc_class

image.png

2.isa 指针

结构

image.png

isa指针主要分为几种

  • 共用体isa
  • 指针型isa isa的值代表class的地址
  • 非指针isa isa的值部分代表class的地址

isa指向

关于对象,指向其类对象 关于类对象,其指向元类对象

method_t

是个结构体,包含了函数四要素(名称 返回值 参数 函数体)

image.png

image.png

类对象与元类对象

image.png

方法缓存

runtime是如何通过Selector找到对应的Imp地址的

1.cache 中查找

hash 查找 给定值是sel,目标是对应的bucket_t的imp

2.当前类中查找

已排序好的列表,二分查找方法对应执行函数

没有排序的,一般遍历查找方法对应执行函数

3.父类逐级查找

消息传递

1.缓存是否命中

2.当前类方法列表是否命中

3.逐级父类方法列表是否命中

4.消息转发流程

消息转发

image.png

4步骤 image.png

Method-Swizzling

方法交换 hook

动态添加方法

image.png

动态方法解析

image.png

参考文章:

runtime

yulingtianxia.com/blog/2014/1…

消息转发机制原理

yulingtianxia.com/blog/2016/0…