- 从今天开始记录下自己学习的一些心得—-开始的日子
oc中,万物皆可对象,对于对象初始化方式一般来说就是 [[class alloc]init] 或
[claas new] 或者开发者自定义的一些初始化方法比如:[[class alloc]initWithFrame:()]等,关于他们的区别今天暂时不说,网上也有很多资料。今天主要想讲的 alloc的流程,到底是怎么样实现的。
- alloc&init

我们可以发现p1,p2,p3相同,说明alloc后对象内存确定后,在进行init 的时候改变的是指向该对象的指针地址发生改变
- 源码分析
我们通过下符号断点的形式看alloc方法,由于只能看到.h文件,没办法看到.mm的具体实现,这个时候就需要我们定位objec源码。
进入后发现首先会调用alloc方法会调用_objc_rootAlloc

之后继续跟发现_objc_rootAlloc 会调用callAlloc

这个时候发现alloc的核心是callAlloc

发现如果是objc2 进入首先检查这个类没有的话直接返回nil;
进入fastpath如果这个必然存在的类的指针对象有默认的 alloc/allocwithzone方法后进入_objc_rootAllocWithZone之后继续进入会调用_class_createInstanceFromZone

首先我们先要计算出这个开辟所需的空间大小
size = cls->instanceSize(extraBytes);
如果知道要分配的内存空间的大小的话,调用malloc返回一个对象,不是的话调用calloc返回的是一个数组申请开辟一个内存,返回地址指针
然后判断obj是否存在,不存在的话就返回一个badAcllocHandler或者nil
之后进行初始化isa指针对象 obj->initInstanceIsa(cls, hasCxxDtor);关联相连的类
整体的流程图大概如下

如有错误,请大家多多包涵。
























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)