在OC開發(fā)語言中所有的對象是通過alloc方法來創(chuàng)建,那么今天我就從源碼里對alloc方法到底做了什么事情,是如何創(chuàng)建出一個對象的,來進行一下探索。
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 并不會參與到創(chuàng)建對象的過程,實際創(chuàng)建對象都是alloc來完成的。通過查看匯編指令和源碼,我們得出alloc 方法底層都調用了哪些方法以及方法的調用順序。
打開匯編查看指令
image.png
alloc 源代碼
image.png
image.png
alloc 底層源碼方法調用流程
我們通過斷點跟蹤得到如下的調用流程
image.png
init 方法
image.png
我們看到源碼里+ (id)init 方法里什么也沒做只是返回對象本身,那么既然什么也沒做Apple 為什么要這么做呢?這是為了讓我們去重寫這個方法去做一些初始化操作,Apple Function 庫里的類也都從寫了init方法,例如我們經常使用NSArray、NSDiction 內部都對init做了重寫。