在OC開發(fā)語(yǔ)言中所有的對(duì)象是通過(guò)alloc方法來(lái)創(chuàng)建,那么今天我就從源碼里對(duì)alloc方法到底做了什么事情,是如何創(chuàng)建出一個(gè)對(duì)象的,來(lái)進(jìn)行一下探索。
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);
打印結(jié)果
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
通過(guò)以上代碼打印結(jié)果可以看出p1和p2 內(nèi)存地址是一樣的由此可以得出p、p1、p2指向的是同一個(gè)對(duì)象,init 并不會(huì)參與到創(chuàng)建對(duì)象的過(guò)程,實(shí)際創(chuàng)建對(duì)象都是alloc來(lái)完成的。通過(guò)查看匯編指令和源碼,我們得出alloc 方法底層都調(diào)用了哪些方法以及方法的調(diào)用順序。
打開匯編查看指令

image.png
alloc 源代碼

image.png

image.png
alloc 底層源碼方法調(diào)用流程
我們通過(guò)斷點(diǎn)跟蹤得到如下的調(diào)用流程

image.png
init 方法

image.png
我們看到源碼里+ (id)init 方法里什么也沒(méi)做只是返回對(duì)象本身,那么既然什么也沒(méi)做Apple 為什么要這么做呢?這是為了讓我們?nèi)ブ貙戇@個(gè)方法去做一些初始化操作,Apple Function 庫(kù)里的類也都從寫了init方法,例如我們經(jīng)常使用NSArray、NSDiction 內(nèi)部都對(duì)init做了重寫。