Object-C alloc 方法探索

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容