类的底层原理01

  1. 类的底层结构
  2. 类的isa指针指向
  3. 类和元类继承之间的关系`

类的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里面包含吗了获取类的协议列表,属性列表,方法列表的方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值