alloc开辟空间流程

项目准备

苹果开源源码汇总: https://opensource.apple.com
这个地址⽤的更直接 https://opensource.apple.com/tarballs/
到这里下载objc的源码进行解析

开始:
首先来看一组打印
例如,一下情况打印的内存地址输出是一样

alloc开辟空间流程_第1张图片

说明alloc开辟了内存空间,init并没有开辟内存空间

alloc又是怎么开辟内存的呢?继续往下
首先来看一张图开辟空间执行顺序

通过源码我们一步一步往里面走
1.alloc调用了_objc_rootAlloc

2._objc_rootAlloc方法中调用了callAlloc方法,但是由于编译器的优化,callAlloc并没有走

3.callAlloc调用_objc_rootAllocWithZone

4_objc_rootAllocWithZone调用_class_createInstanceFromZone
1).cls->instanceSize计算开辟内存空间的大小
点进去方法发现得到的内存是16

alloc开辟空间流程_第2张图片

系统在开辟内存的时候是内存对齐的,都是16的倍数,为了更快和安全
每个对象分配出来都会包含一个isa,isa就会占8个字节,如果只是分配8个字节的话,每一个创建出来的对象都会紧挨着前一个对象,所以很容易出现野指针,访问内存错误等问题,而16字节是留出来了预留字节,这样每次访问的时候会相对于更加安全

2).calloc  向系统申请内存,返回地址指针

图上方法走之前,obj是nil,但是当方法走了以后,会返回一个地址指针,但是这个地址指针并没有关联到我们的类上面
3).obj->initInstanceIsa关联到对象

上图方法走之前打印obj可以看到只是一个地址,并没有输出我们的类

但是当走了obj->initInstanceIsa方法以后,我们再次打印发现

此时我们的类名已经关联到了指针上面

然后返回我们的对象


你可能感兴趣的:(alloc开辟空间流程)