// 类或者父类是否有 C++ 构造方法或析够方法 bool hasCxxCtor = cxxConstruct && cls->hasCxxCtor(); bool hasCxxDtor = cls->hasCxxDtor(); //是否能alloc nonpointer isa bool fast = cls->canAllocNonpointer(); size_t size; // 计算对象所需大小,这里 extraBytes == 0,由前一函数传递 size = cls->instanceSize(extraBytes); // 将计算好的 size 通过指针地址传递出去,不影响我们理解主流程,可以忽略 if (outAllocatedSize) *outAllocatedSize = size;
id obj; // 判断是否有 zone,在之前的版本是有 zone 的 if (zone) { obj = (id)malloc_zone_calloc((malloc_zone_t *)zone, 1, size); } else { // alloc 开辟内存的地方 obj = (id)calloc(1, size); } // 这里是内存开辟错误执行的流程,字面意思可以看到,系统调用了 alloc 失败句柄 if (slowpath(!obj)) { if (construct_flags & OBJECT_CONSTRUCT_CALL_BADALLOC) { return _objc_callBadAllocHandler(cls); } returnnil; }
if (!zone && fast) { // 初始化 isa,并将类与 isa 关联 obj->initInstanceIsa(cls, hasCxxDtor); } else { // Use raw pointer isa on the assumption that they might be // doing something weird with the zone or RR. // 老版本的内存分配 obj->initIsa(cls); } // 若没有 C++ 构造函数,则将关联好类的 isa 返回 if (fastpath(!hasCxxCtor)) { return obj; } // 若有 c++ 构造函数,则走 c++ 构造流程 construct_flags |= OBJECT_CONSTRUCT_FREE_ONFAILURE; return object_cxxConstructFromClass(obj, cls, construct_flags); }