oc底层探索-alloc
在oc中,创建对象经常用
Class A = [[Class alloc] init];
那么alloc 和init究竟做了什么呢
首先在 https://opensource.apple.com/tarballs/objc4/ 这里下载苹果的开源代码
然后全局搜alloc,一步步跟着走就好了
先调用 _objc_rootAlloc(self)
然后是 callAlloc(cls, false/checkNil/, true/allocWithZone/);
由于现在苹果已经废弃了老的objc,所以走宏定义OBJC2
在这段代码中,cls->ISA()->hasCustomAWZ()会返回true
bool hasCustomAWZ() {
return ! bits.hasDefaultAWZ();
}
bool hasDefaultAWZ() {
return data()->flags & RW_HAS_DEFAULT_AWZ; // uint32_t flags;
}
#define RW_HAS_DEFAULT_AWZ (1<<16)
cls->canAllocFast(),由于宏定义FAST_ALLOC为0,所以永远返回no
那么会走这一段代码
id obj = class_createInstance(cls, 0);
if (slowpath(!obj)) return callBadAllocHandler(cls);
return obj;
接下来到_class_createInstanceFromZone这个函数里面
会直接进入第一个判断,开辟空间,初始化Isa,然后返回obj,结束
if (!zone && fast) {
obj = (id)calloc(1, size);
if (!obj) return nil;
obj->initInstanceIsa(cls, hasCxxDtor);
}
alloc初始化流程图
最后附加一点
对于init
可以从源码中看到实际上是返回的self自己
对于new
实际上是调用了callAlloc方法,之后走的流程和alloc之后的是一样的