类底层原理

首先照常先来一发代码

类底层原理_第1张图片

结果是地址一样的!!!why?类在哪里?其实类在内存里面只会存在一份!

那么这样呢?得到的是什么?

其实cls4 是原类。他们的逻辑其实是:
类初始化出一个实例对象p,而原类实例化出一个类对象(原类是由系统管理,系统去初始化)
那么原类的上边又是什么呢?叫根原类,根原类是他自己,如图

类底层原理_第2张图片

isa 指针底层来看是一个联合体

联合体(节省消耗)
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

而isa 指针指向 对象 -> 类 -> 原类 -> 根原类
父类的指向是 对象 -> 父类 -> objc -> nil ;其中根原类的父类为objc,如图:

类底层原理_第3张图片

例:

  1. person 的父类是obj ,他的isa 指向 原类 -> 根原类 -> 循环; 原类的父类是根原类,根原类的父类是obj,obj的父类是nil。
  2. objc 的父类是nil ,它的isa指向 根原类 -> 根原类循环; 根原类的父类是objc。

查看class 源码可以知道包括以下主要的内容

类底层原理_第4张图片

上图可以看出,ivar(变量)是保存在ro(只读)里边的,所以当类创建成功以后,没有办法修改(也就是没有办法动态的修改类的变量),但是可以动态的修改属性(属性列表数组保存在rw里边)。

所以addivar 方法必须在registerClassPair 方法以前调用,否则无法添加进去

类的type:

类底层原理_第5张图片

对象方法保存在类里边;类方法保存在原类里边,详见下图:

类底层原理_第6张图片

这篇博客里边介绍的各种类的关键字也非常不错,记录一下:https://www.jianshu.com/p/b210c9b339fa

你可能感兴趣的:(类底层原理)