想彻底的了解runtime,那么就需要从底层了解开始,这边文章将介绍一下Class的结构
类的结构大概如下图
class结构
可以看到有isa、superclass、cache以及bits,isa和superclass可以看之前这篇文章:对象的isa与superclass
那让我们先来看看 bits里面有什么东西,我们查看源码,如下图
class_data_bits_t部分源码
可以看到,有一个data()函数,里面使用了bits & FAST_DATA_MASK,就返回了一个class_rw_t的数据,那么class_rw_t又是什么呢,我们继续寻找它的定义源码
class_rw_t部分源码1
class_rw_t部分源码2
class_rw_t部分源码3
我们整理一下,大概就如下图
class_rw_t结构图
里面又有一个class_ro_t,那么这里面的结构如下图
class_ro_t结构图
class_rw_t与class_ro_t的区别
class_rw_t有methods、properties、protocols,它们都是二维数组,是可读可写的,包含了类的初始内容、分类的内容 ,举例
class_rw的methods结构
class_ro_t有baseMethodList、baseProtocols、ivars、baseProperties,它们是一维数组,是只读的,包含了类的初始内容
class_ro_t的baseMethodList结构
Method_t
Method_t,主要结构如下图:
Method_t主要结构
它其实就是一个方法的封装,函数体、参数、名称都具备
方法缓存
为什么要做方法缓存呢,假设你这个方法调用了10次,然后方法数组里又有10个方法,那你岂不是要查100次?所以苹果专门为这个设计了一个叫做方法缓存的东西,采用散列表算法来提高方法的查找速度,直接看图
cache_t结构图
扩展
- SEL可以当做一个字符串,一个名字;不同类的sel,只要名字相同,那么它们是一样的,包括地址
- types为i24@0:8i16f20,代表返回值int,参数int,float,24:所有参数所占的字节数,0 : 从0开始,8 :从第8个字节开始…