一般我们创建对象的两种方式:
这两种方式有什么区别和联系呢?
我去网上找了一下资料,很多都是基于objc-818的开源代码进行分析的。
首先看alloc的源码分析
通过Person的alloc方法作为入口,来到了NSObject.mm里面的alloc类方法实现
接着是
_objc_rootAlloc方法实现
接着是
callAlloc方法实现
这块有
if/else分支,经过断点调试,会进入红框中的代码,_objc_rootAllocWithZone方法
接下来的方法
_class_createInstanceFromZone是核心逻辑,
第一步:计算对象需要的内存大小;
instanceSize;
第二步:使用calloc函数申请内存大小,calloc;
第三步:创建isa,并且把cls与isa关联,initInstanceIsa;
接下来分析init方法的实现
init方法里面调用了_objc_rootInit
_objc_rootInit里面没有做什么事情,只是把当前对象返回了,系统这样做的目的是为了方便我们重写init方法。
接下来分析new方法的实现
new方法里面调用了callAlloc,又通过callAlloc的返回值调用了init方法,所以new可以理解为alloc和init的结合体。