runtime底層之a(chǎn)lloc的底層探究

我們?cè)谌粘i_(kāi)發(fā)中都知道alloc的功能是給對(duì)象來(lái)分配內(nèi)存的,但是具體底層怎么實(shí)現(xiàn)很少有人去探究,接下來(lái)我們通過(guò)源碼加匯編的結(jié)合來(lái)分析alloc的底層實(shí)現(xiàn)。

在學(xué)習(xí)alloc之前要知道一下runtime是什么,runtime的字面意思是運(yùn)行時(shí),runtime具體是指由C、C++、匯編實(shí)現(xiàn)的一套API,從OC到C語(yǔ)言的過(guò)渡增加了運(yùn)行時(shí)功能。

一、給alloc添加斷點(diǎn)調(diào)試:

首先以一個(gè)Person的類為例來(lái)講:

Person *obj = [Person alloc];

調(diào)用alloc方法,實(shí)際上是runtime使用objc_msgSend進(jìn)行消息轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn)的方法,接下來(lái)來(lái)給alloc加上一個(gè)全局?jǐn)帱c(diǎn):

alloc的全局?jǐn)帱c(diǎn)

二、一步步分析objc源碼

運(yùn)行應(yīng)用斷點(diǎn)會(huì)來(lái)到alloc的匯編分析:

alloc的匯編分析

從這兩行匯編代碼中可以看出來(lái),alloc實(shí)際上調(diào)用的是libobjc里的_objc_rootAlloc方法,接下來(lái)查看官方objc源碼(蘋(píng)果官網(wǎng)opensource里下載)來(lái)找到這個(gè)方法.

alloc方法

從alloc源碼方法里可以看到跟在匯編里調(diào)用的方法都是_objc_rootAlloc,接下來(lái)再進(jìn)去_objc_rootAlloc方法看:

_objc_rootAlloc方法

由上可以看到_objc_rootAlloc方法的返回值有個(gè)callAlloc,繼續(xù)點(diǎn)進(jìn)去會(huì)進(jìn)去callAlloc方法,接下來(lái)會(huì)走:

callAlloc方法實(shí)現(xiàn)
返回實(shí)例對(duì)象

三、最終實(shí)現(xiàn)

此時(shí)的obj這個(gè)返回值已經(jīng)是我們需要的實(shí)例對(duì)象了,它是通過(guò)class_createInstance方法來(lái)實(shí)現(xiàn),class_createInstance最終會(huì)調(diào)用initIsa來(lái)創(chuàng)建實(shí)例對(duì)象并返回;

initIsa

最終alloc的作用是通過(guò)類來(lái)創(chuàng)建實(shí)例對(duì)象。

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,072評(píng)論 0 9
  • 本文基于對(duì)象的實(shí)現(xiàn)原理來(lái)深入剖析 OC 的底層相關(guān)原理。這里并不會(huì)簡(jiǎn)單的介紹純理論知識(shí),而是借助工具和編碼實(shí)現(xiàn)相關(guān)...
    steveyoung閱讀 1,121評(píng)論 2 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,674評(píng)論 1 32
  • I remember when I first found out I was going to speak at...
    一夜讀閱讀 686評(píng)論 0 0
  • 怪我沒(méi)用,始終放不下你 沒(méi)能把你遺忘...我不知道你們有沒(méi)有這樣一種想法和一個(gè)人分手后,很久后都不能釋?xiě)?,感覺(jué)身...
    大魚(yú)禾閱讀 801評(píng)論 0 1

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