探究oc底層必須去蘋果開源的網(wǎng)站下載Objc源碼
下載大家可以從 此處下載到objc源碼 但是下載下來是不能用的。需要進(jìn)行一系列配置,我個人是從github上面找到的配置好的,避免在上面浪費特別多的時間

同時也要將這個開關(guān)打開,進(jìn)行匯編層面的分析。

alloc
首先創(chuàng)建一個OC類,并執(zhí)行alloc方法

打斷點進(jìn)入?yún)R編

由此可以得出oc里面的初始化是由objc_msgsend向類發(fā)送alloc消息
他的定義為
objc_msgSend(id 消息接受者,sel 發(fā)送消息)
進(jìn)行發(fā)送的從匯編進(jìn)入objc_msg_send可以輸入regiter read

添加一個 symbol “alloc”斷點

點擊下一步 可以看到斷點進(jìn)入了 libobjc.A.dylib

由此我們查找的文檔應(yīng)該是libobjc,看到跳入的方法為 _objc_rootAlloc

打開NSObject的c++文件,查看_objc_rootAlloc的方法構(gòu)成,同時也繼續(xù)走斷點 走入了objc_rootAlloc:



將斷點進(jìn)入 _class_createInstance方法看到,并將斷點打到他的返回值的地方


由此可見_class_createInstaceFromZone 創(chuàng)建了實例對象

那么既然alloc已經(jīng)生成這個對象了為什么還要執(zhí)行init呢,下面繼續(xù)分析
init

開啟進(jìn)入?yún)R編的模式

objcmsgsend向Person發(fā)送了ini條消息 那個指針是init但是沒有標(biāo)識出來。
電腦太卡了調(diào)試不過去總之他就是走到NSObject的init方法



可以看到init方法 將self穿進(jìn)去然后又將其返回,可以看到他將我們傳回去的obj又返回來了,可以看出來他其實什么也沒做,蘋果這么做的原因是為了讓子類重寫時可以返回響應(yīng)的obj做初始化其他的參數(shù)。根據(jù)自己的需求返回自己想要的obj
總結(jié)
objc alloc流程是
- 調(diào)用alloc方法
- objcmsgsend(class,alloc) 調(diào)用_objc_rootAlloc
- 調(diào)用callAlloc
- 調(diào)用class_createInstance
- 調(diào)用_class_createInstanceFromZone
- 最終得到了響應(yīng)類型的對象
objc init
init初始化其實是一個_objc_rootInit獲得他自身,這樣設(shè)計的主要原因是可以讓子類重寫這個方法然后根據(jù)需求得到想要的對象