美文网首页
oc底层探索-alloc

oc底层探索-alloc

作者: otc1 | 来源:发表于2019-12-26 15:25 被阅读0次

    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

    相关文章

      网友评论

          本文标题:oc底层探索-alloc

          本文链接:https://www.haomeiwen.com/subject/mqxanctx.html