源码分析alloc 可验证 alloc探究(一) 中三种方法
1.配置objc4-756.2源码调试
----如何配置objc4-756.2源码调试可参考 objc4-756.2源码调试
2.当我们进入到源码里来即可跟踪源码分析
3.分析alloc
3.1 在进入到NSObject.mm文件后 发现alloc直接返回 _objc_rootAlloc(self) 没有悬念直接 jump


jump过来 callAlloc 函数实现如下图

- 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 看到
- if (fastpath(cls->canAllocFast()))



- if (allocWithZone)
return [cls allocWithZone:nil]; return [cls alloc];
最后
alloc的流程梳理为:
