oc底層探索-alloc
在oc中,創(chuàng)建對象經(jīng)常用
Class A = [[Class alloc] init];
那么alloc 和init究竟做了什么呢
首先在 https://opensource.apple.com/tarballs/objc4/ 這里下載蘋果的開源代碼
然后全局搜alloc,一步步跟著走就好了
先調(diào)用 _objc_rootAlloc(self)

image.png
然后是 callAlloc(cls, false/checkNil/, true/allocWithZone/);

image.png
由于現(xiàn)在蘋果已經(jīng)廢棄了老的objc,所以走宏定義OBJC2

image.png
在這段代碼中,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這個函數(shù)里面

image.png
會直接進入第一個判斷,開辟空間,初始化Isa,然后返回obj,結束
if (!zone && fast) {
obj = (id)calloc(1, size);
if (!obj) return nil;
obj->initInstanceIsa(cls, hasCxxDtor);
}
alloc初始化流程圖

alloc流程圖
最后附加一點
對于init
可以從源碼中看到實際上是返回的self自己

image.png

image.png
對于new
實際上是調(diào)用了callAlloc方法,之后走的流程和alloc之后的是一樣的

image.png