oc底層探索-alloc

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
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容