OC alloc init 實現(xiàn)原理

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

image.png

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

alloc

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

image.png

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

由此可以得出oc里面的初始化是由objc_msgsend向類發(fā)送alloc消息
他的定義為

objc_msgSend(id 消息接受者,sel 發(fā)送消息)

進(jìn)行發(fā)送的從匯編進(jìn)入objc_msg_send可以輸入regiter read

image.png

添加一個 symbol “alloc”斷點


image.png

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


image.png

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

image.png

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


image.png

image.png
image.png

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


image.png

image.png

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


image.png

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

init

1

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


image.png

objcmsgsend向Person發(fā)送了ini條消息 那個指針是init但是沒有標(biāo)識出來。

電腦太卡了調(diào)試不過去總之他就是走到NSObject的init方法


image.png

image.png

image.png

可以看到init方法 將self穿進(jìn)去然后又將其返回,可以看到他將我們傳回去的obj又返回來了,可以看出來他其實什么也沒做,蘋果這么做的原因是為了讓子類重寫時可以返回響應(yīng)的obj做初始化其他的參數(shù)。根據(jù)自己的需求返回自己想要的obj

總結(jié)

objc alloc流程是

  1. 調(diào)用alloc方法
  2. objcmsgsend(class,alloc) 調(diào)用_objc_rootAlloc
  3. 調(diào)用callAlloc
  4. 調(diào)用class_createInstance
  5. 調(diào)用_class_createInstanceFromZone
  6. 最終得到了響應(yīng)類型的對象

objc init
init初始化其實是一個_objc_rootInit獲得他自身,這樣設(shè)計的主要原因是可以讓子類重寫這個方法然后根據(jù)需求得到想要的對象

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

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

  • 導(dǎo)入 import {Linking} from 'react-native'; 在點擊方法里面執(zhí)行 return...
    以德扶人閱讀 3,233評論 0 51
  • 1、眼睛清澈明亮,眼神堅定有力,目光像能夠穿透人體,物體一樣。道家所謂“碧眼方瞳是神仙”,指的就是這種修煉者中脈打...
    格日樂其其格閱讀 8,797評論 4 56
  • 禪舞是什么?禪舞即禪心之舞。它是禪學(xué)文化跟舞蹈藝術(shù)融為一體的一種修身養(yǎng)性的方法。禪舞是在身心寧靜的狀態(tài)下...
    Mandy曼翎閱讀 541評論 0 0
  • 等你 今天下午,陪著她們做完眼睛保健操。就背上包準(zhǔn)備出發(fā),接到老公的電話。老公在校門在等了好久了...
    11e0cc0f43c1閱讀 153評論 0 1

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