oc底层探索-alloc

2019-12-26  本文已影响0人  otc1

oc底层探索-alloc

在oc中,创建对象经常用

Class A = [[Class alloc] init];

那么alloc 和init究竟做了什么呢

首先在 https://opensource.apple.com/tarballs/objc4/ 这里下载苹果的开源代码

然后全局搜alloc,一步步跟着走就好了
先调用 _objc_rootAlloc(self)

image.png
然后是 callAlloc(cls, false/checkNil/, true/allocWithZone/); image.png
由于现在苹果已经废弃了老的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这个函数里面


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

实际上是调用了callAlloc方法,之后走的流程和alloc之后的是一样的


image.png
上一篇下一篇

猜你喜欢

热点阅读