oc對象內(nèi)存布局

OC對象分為3種:

instance對象(實(shí)例對象)

class對象(類對象)

meta-class對象(元類對象)

OC對象的本質(zhì)是結(jié)構(gòu)體,每一個對象內(nèi)部有一個isa指針(占8個字節(jié))。

oc對象源碼
isa指針與superClass指針指向

實(shí)例對象:

所有父類的成員變量和自己的成員變量具體值都會存放在該對象所對應(yīng)的存儲空間中。isa指針指向他的類對象(64bit后,isa需要進(jìn)行一次位運(yùn)算(& ISA_MASK),才能計(jì)算出類對象的真實(shí)地址),實(shí)例對象沒有superClass指針。

類對象

在內(nèi)存中存儲的信息主要包括:isa指針(因?yàn)轭惐旧硪彩且粋€對象)、superClass指針、類的屬性信息(@property)、類的對象方法信息(instance method)、類的協(xié)議信息(protocol)、類的成員變量信息(注意:ivar,不是成員變量的值,是指類型、名字)。

類對象isa指針指向元對象(meta class)

元對象(meta-class):

在內(nèi)存中存儲的信息主要包括:isa指針、superclass指針、類的類方法信息。元對象(meta-class)對象和類(class)對象內(nèi)存結(jié)構(gòu)一樣

meta-class對象的isa指向基類的meta-class對象

isa指針的詳解與作用

在arm64架構(gòu)之前,isa就是一個普通的指針,存儲著Class、Meta-Class對象的內(nèi)存地址,在arm64開始,對isa進(jìn)行了優(yōu)化,變成了一個共用體(union)結(jié)構(gòu),還是用位于來存儲很多信息。

因?yàn)轭悓ο笾写鎯χ惖膶ο蠓椒ㄐ畔?,?dāng)調(diào)用對象方法時,通過instance的isa找到class,最后找到對象方法的實(shí)現(xiàn)進(jìn)行調(diào)用

因?yàn)樵獙ο笾写鎯χ惖念惙椒ㄐ畔ⅲ?dāng)調(diào)用類方法時,通過class的isa找到meta-class.最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用

superClass指針的作用:

當(dāng)一個對象調(diào)用的方法來自于父類:因?yàn)轭悓ο蟮膕uperClass指向父類的類對象:1、通過對象的isa指針找到類對象 2、通過類對象的superclass父類類對象,從而的父類對象方法列表中找到方法的實(shí)現(xiàn)。

當(dāng)調(diào)用來自父類的類方法時:因?yàn)樵悓ο蟮膕uperClass指針指向父類的元類對象:1、通過類對象的isa指針找到元類對象 2、通過元類對象的superClass指針找到父類元對象,從而在父類元類對象方法列表中找到方法實(shí)現(xiàn)。一層層傳遞,如果走到基類的元對象仍沒有找到方法實(shí)現(xiàn),就去基類的類對象中去尋找實(shí)例方法。

方法調(diào)用流程詳細(xì)步驟

值得注意的是:如果沒有父類,類對象的superclass指針為nil,元類(meta-class)的superclass指針指向基類的類對象(isa指針與superClass指針指向圖可以看出)

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

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

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