01Class的结构

想彻底的了解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个字节开始…
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容