alloc探究(二)

277 阅读1分钟

源码分析alloc 可验证 alloc探究(一) 中三种方法

1.配置objc4-756.2源码调试

----如何配置objc4-756.2源码调试可参考 objc4-756.2源码调试
2.当我们进入到源码里来即可跟踪源码分析


3.分析alloc
3.1 在进入到NSObject.mm文件后 发现alloc直接返回 _objc_rootAlloc(self) 没有悬念直接 jump

3.2 jump to Definition _objc_rootAlloc 此时_objc_rootAlloc 返回callAlloc(cls,false,true) 没有悬念直接 jump
3.3 jump to Definition callAlloc
jump过来 callAlloc 函数实现如下图
分析 callAlloc 函数存在3个条件判断

  • if (slowpath(checkNil && !cls)) return nil;
    #define slowpath(x) (__builtin_expect(bool(x), 0))
    __builtin_expect这个指令是gcc引入的,作用是允许程序员将最有可能执行的分支告诉编译器。这个指令的写法为:__builtin_expect(EXP, N)。意思是:EXP==N的概率很大。
    而checkNil默认传false 则不会返回nil
  • if (fastpath(!cls->ISA()->hasCustomAWZ())) 里存在条件判断
    • if (fastpath(cls->canAllocFast()))
      #define fastpath(x) (__builtin_expect(bool(x), 1))
      若cls->canAllocFast()为true 则会执行
      而jump canAllocFast 函数后为:
      继续jump bits.canAllocFast
      发现该函数永远返回fasle;
      由此判断fastpath(cls->canAllocFast())条件下代码永远不会执行
    • else 那么会来到
      jump class_createInstance 看到

继续jump _class_createInstanceFromZone 看到

当断点在7002行时 po obj不出值 内存地址已经存在 运行过7003行时 po obj可发现对象为ZZPerson类型 可推断calloc为obj开辟了空间 initInstanceIsa与cls(ZZPerson)关联 绑定

  • if (allocWithZone)
    return [cls allocWithZone:nil]; return [cls alloc];

最后

alloc的流程梳理为: