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