- 类的底层结构
- 类的isa指针指向
- 类和元类继承之间的关系`
类的isa指针指向
通过输出类对象的三种生成方式,的类对象isa指向的地址发现指向同一块内存。所以得出结论我们的类对象只有一个
在上一个篇章我们说过 实例对象 包含的了isa 和 相关属性, 从源码截图得知 类本质是一个继承自object_object的object_class结构体,也有一个isa指针。如果说实例对象的isa指针指向它的类对象,那类对象的isa指针指向元类对象。
M1 芯片的是arm
Intel的是x86
通过输出实例对象p的16进制地址,然后通过与isa_mask输出p的isa,此时isa指向类的对象,所以可以继续输出16进制地址然后在输出isa,此时发现两个地址不一样。那么之前说类的对象只有一个是否矛盾呢?未必然 因为类的对象指向的其实是元类的对象,虽然说输出的类名一样,然后重复这个流程我们发现:
实例对象 isa-> 类对象 isa-> 元类 isa-> 根源类 isa-> 根源类自己 ;
获取父类:
objc_getClass
其实想要获取元类有更简单方法:
objc_getMetaClass
获取元类的父类:
class_getSuperclass
类的底层结构
前面四个方法表示当前的类暂时不讨论,
ISA 表示类对象指针 8字节
superclass 表示当前类对象的父类 8字节
cache_t 表示当前类所贮备缓存(后面会有独立文章详解)16字节
bits 目测表示占用的内存空间
内存平移
在C语言当中
int c[4] = {1,2,3,4}; &C 相当于 &c[1]
因为 c可以看成指向一个整块内存第一位的指针 ,所以当赋值给*d 等于指向了出C【0】的地址。这里d+1就是内存平移
所以当我们获取到类对象内存的首地址,平移32字节就是bits。
就可以这样写
这里0x1000080c8 就是我们bits的首地址
通过源码分析往下层层递进,发现实际上储存了一个class_rw_T里面包含吗了获取类的协议列表,属性列表,方法列表的方法