今天我们来探讨一下iOS对象的创建流程,也就是alloc init底层的一个流程到底是怎么操作的首先初始化一个对象:
Person *p = [[Person alloc] init];
根据汇编符号我们会走到底层这里:
可以知道它的底层是以 objec_alloc的格式,接着会走到下一步
会走到我们的_objc_rootAlloc这里,里面返回的callAlloc函数,接着往里面走
可以看到,callAlloc里面有个#if #endif 的判断
如果cls->ISA()->hasCustomAWZ()返回YES,意味着有默认的allocWithZone方法,那么就直接对class进行allocWithZone,申请内存空间。接着进入_objc_rootAllocWithZone方法
可以看到直接返回的_class_createInstanceFromZone方法
这一部分就是我们的对象alloc的核心内容了
首先它创建了一个size_t ,这个就是首先计算出我们需要开辟的内存空间大小
instanceSize的内部可以看到申请的内存大小size = 16,不够16的系统会自动进行内存对齐。
接着创建了一个id obj 的对象,用来向系统申请一个指针地址
这一步仅仅只是对obj这个对象申请的地址,此时我们的Person对象还没有对应到相关的地址,接下来才是关联的一步
此时,我们初始化的Person对象才和申请的内存指针地址关联到
回到上面所说的 cls->ISA()->hasCustomAWZ()如果返回NO
那么会判断cls->canAllocFast() 当前的class是否支持快速alloc, 可以的话那么调用上面的calloc再到 initInstanceIsa关联指针地址。
具体的细节流程图如下: