OC对象的alloc、init、new主要做了哪些事

164 阅读1分钟

一般我们创建对象的两种方式:

image.png 这两种方式有什么区别和联系呢? 我去网上找了一下资料,很多都是基于objc-818的开源代码进行分析的。

首先看alloc的源码分析

通过Personalloc方法作为入口,来到了NSObject.mm里面的alloc类方法实现

image.png 接着是_objc_rootAlloc方法实现

image.png 接着是callAlloc方法实现

image.png 这块有if/else分支,经过断点调试,会进入红框中的代码,_objc_rootAllocWithZone方法

image.png 接下来的方法_class_createInstanceFromZone是核心逻辑,

image.png 第一步:计算对象需要的内存大小;instanceSize

第二步:使用calloc函数申请内存大小,calloc

第三步:创建isa,并且把cls与isa关联,initInstanceIsa;

接下来分析init方法的实现

image.png init方法里面调用了_objc_rootInit

image.png _objc_rootInit里面没有做什么事情,只是把当前对象返回了,系统这样做的目的是为了方便我们重写init方法。

接下来分析new方法的实现

image.png new方法里面调用了callAlloc,又通过callAlloc的返回值调用了init方法,所以new可以理解为allocinit的结合体。