Object-C alloc 方法探索

在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做了重寫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容