IOS底层

iOS 底层解析-----RunTime 之 isa与Class

2019-04-16  本文已影响60人  Mr丨Yang

之前文章有提到一个类的数据结构中存在着isa指针,本文将列出isa的结构,以及所存储的信息
首先isa指针在内存中占8位,即64个字节,在这64个字节中存储着大量的信息,存储的方法运用到了C语言的共用体(本文不做详解,可以自行了解,具体参考引用链接,如有侵犯作者权益请与我联系)。
对C语言中共用体不了解的我可以做如下比喻:

就OC中的isa指针而言,它分配的内存为8位,64个字节,可以理解为一个盒子,它本来只有一个存取口,即一把钥匙就可以取出其中的东西,但是它却开辟了好多存取口给用户,有好多把的钥匙,实际在这些存取口背后,共用的同一个空间,它堆放的有玉米,黄豆,大米等物品,但是它却做出来规定,你用1号钥匙去取,取出来的是玉米,你用2号钥匙去取,取出来的却是黄豆,这就是共用体,相当于给钥匙进行编号,然后去 & 或者 | 来取值,这样在同一片内存中就可以同时存在多种数据

在arm64之前,isa就是一个普通的指针,存储这Class、Meta-Class对象的内存地址,但是从arm64之后,对isa进行了优化,变成了一个共用体(union)结构,使用位域来存储更多的信息,基本结构如下图 isa指针结构体.png 位域中的各个字段的意义 isa详解-位域.png

这样一个类的isa就可以存储大量有用的信息

其中shiftcls存储着Class、Meta-Class对象的内存地址信息,那么isa指针&上对用的值,就可以取到Class、Meta-Class对象的内存地址,别的数据是类似的,就相当于拿不同的钥匙取值

isa指针一文中,给出了Class的数据结构,本位详细展开数据结构中元素的讲解

Class结构.png

bit中存在具体的类信息
第一步 进行&运算,取出Class_rw_t 结构(可以读写的结构)
第二步 可以直接通过*ro 取出Class_ro_t结构(只读的结构,即类初始化的结构)


Class_rw_t.png
class_ro_t.png

方法method_t结构


method_t.png

class中的cache 方法缓存


cache_t.png

它会使用哈希算法,将它最近调用的所有方法,缓存到缓存列表中,一个类的方法在调用的时候会先去缓存中查找,找到了直接调用,找不到会再去对应的类中的方法中查找,调用之后,再次缓存到类中的缓存列表中(至于哈希算法本文不在阐述,自行百度)

上一篇下一篇

猜你喜欢

热点阅读