在我们开发中,创建一个对象需要 [NSObject alloc] init] 来实现,那么一个对象通过调用alloc生成对象具体流程是什么呢?今天我们就从底层源码来进行查看(注:由于电脑比较老 系统还是macOS Catania 10.15.7 所用的底层源码是objc4-818.2)
底层源码流程
简单的说 如果方法名是alloc 就会去实现objc_alloc函数。
在objc_alloc方法内调用callAlloc方法
在callAlloc内实现 objc_msgSend 向对象发送alloc消息 接下来进入alloc方法
在alloc方法内调用 _objc_rootAlloc方法
在_objc_rootAlloc方法内再次调用 callAlloc方法
此次调用callAlloc内的_objc_rootAllocWithZone方法
在_objc_rootAllocWithZone 方法内调用 _class_createInstanceFromZone方法
在_class_createInstanceFromZone方法内返回obj对象。
所以,alloc的流程可以按图所示
内存对齐
如上图所示 在_class_createInstanceFromZone方法内我们可以看到 size = cls->instanceSize(extraBytes);计算对象实际需要的内存大小
继续向下跟踪 如图所示
总结:根据系统是32位还是64位 来进行内存对齐。