iOS对象底层探索之alloc流程

259 阅读1分钟

今天我们来探讨一下iOS对象的创建流程,也就是alloc init底层的一个流程到底是怎么操作的首先初始化一个对象:

Person *p = [[Person alloc] init];

根据汇编符号我们会走到底层这里:

image.png 可以知道它的底层是以 objec_alloc的格式,接着会走到下一步

image.png 会走到我们的_objc_rootAlloc这里,里面返回的callAlloc函数,接着往里面走

image.png 可以看到,callAlloc里面有个#if #endif 的判断 如果cls->ISA()->hasCustomAWZ()返回YES,意味着有默认的allocWithZone方法,那么就直接对class进行allocWithZone,申请内存空间。接着进入_objc_rootAllocWithZone方法

image.png 可以看到直接返回的_class_createInstanceFromZone方法

image.png

这一部分就是我们的对象alloc的核心内容了

首先它创建了一个size_t ,这个就是首先计算出我们需要开辟的内存空间大小

image.png

image.png instanceSize的内部可以看到申请的内存大小size = 16,不够16的系统会自动进行内存对齐。

接着创建了一个id obj 的对象,用来向系统申请一个指针地址

image.png

这一步仅仅只是对obj这个对象申请的地址,此时我们的Person对象还没有对应到相关的地址,接下来才是关联的一步

image.png

此时,我们初始化的Person对象才和申请的内存指针地址关联到

回到上面所说的 cls->ISA()->hasCustomAWZ()如果返回NO

那么会判断cls->canAllocFast() 当前的class是否支持快速alloc, 可以的话那么调用上面的calloc再到 initInstanceIsa关联指针地址。

具体的细节流程图如下:

alloc流程图.png