在OC开发语言中所有的对象是通过alloc方法来创建,那么今天我就从源码里对alloc方法到底做了什么事情,是如何创建出一个对象的,来进行一下探索。
WHLPerson *p = [WHLPerson alloc];
p.age = 20;
WHLPerson *p1 = [p init];
WHLPerson *p2 = [p init];
NSLog(@"\np1 = %@\np2 = %@",p1,p2);
NSLog(@"%d %d",p1.age,p2.age);
打印结果
2022-12-03 16:24:51.953275+0800 WHL-alloc[2621:43568]
p1 = <WHLPerson: 0x6000012486b0>
p2 = <WHLPerson: 0x6000012486b0>
2022-12-03 16:24:51.953415+0800 WHL-alloc[2621:43568] 20 20
通过以上代码打印结果可以看出p1和p2 内存地址是一样的由此可以得出p、p1、p2指向的是同一个对象,init 并不会参与到创建对象的过程,实际创建对象都是alloc来完成的。通过查看汇编指令和源码,我们得出alloc 方法底层都调用了哪些方法以及方法的调用顺序。
打开汇编查看指令
image.png
alloc 源代码
image.png
image.png
alloc 底层源码方法调用流程
我们通过断点跟踪得到如下的调用流程
image.png
init 方法
image.png
我们看到源码里+ (id)init 方法里什么也没做只是返回对象本身,那么既然什么也没做Apple 为什么要这么做呢?这是为了让我们去重写这个方法去做一些初始化操作,Apple Function 库里的类也都从写了init方法,例如我们经常使用NSArray、NSDiction 内部都对init做了重写。