iOS底层之alloc流程

2021-06-16  本文已影响0人  囤囤fc

调用alloc方法底层流程

  1. 调用alloc方法
    FCPerson *p = [FCPerson alloc].
  2. 调用alloc方法时,llvm编译阶段会对alloc方法进行拦截,不会按正常流程调用_objc_rootAlloc,而是会先调用objc_alloc,并对其进行特殊处理及标记,然后进入到callAlloc方法中
  3. callAlloc 代码如下:
#if __OBJC2__
    if (slowpath(checkNil && !cls)) return nil;
    if (fastpath(!cls->ISA()->hasCustomAWZ())) {
        return _objc_rootAllocWithZone(cls, nil);
    }
#endif

    // No shortcuts available.
    if (allocWithZone) {
        return ((id(*)(id, SEL, struct _NSZone *))objc_msgSend)(cls, @selector(allocWithZone:), nil);
    }
    return ((id(*)(id, SEL))objc_msgSend)(cls, @selector(alloc));

第一次走到callAlloc时,不会走到return _objc_rootAllocWithZone(cls, nil);,而是通过return ((id(*)(id, SEL))objc_msgSend)(cls, @selector(alloc));对cls重新发送alloc消息。第二次调用alloc方法时,系统会判断对象已经经过特殊处理,可以走正常流程,则依次调用_objc_rootAlloc, callAlloc,最终走到OBJC2中的_objc_rootAllocWithZone

  1. _objc_rootAllocWithZone中会调用核心方法_class_createInstanceFromZone:
 obj->initInstanceIsa(cls, hasCxxDtor);

isa绑定过程可见对象本质 & isa解析

  1. 整体流程图:


    alloc流程
上一篇下一篇

猜你喜欢

热点阅读