OC底層學(xué)習(xí)筆記(2)-OC對象,isa指針,superclass分析

注:文章為自己學(xué)習(xí)李明杰老師的OC底層視頻做的隨手筆記

OC的對象主要可分為三類
1.instance對象----實(shí)例對象
2.class對象---類對象
3.meta-class對象---元類對象

1.instance對象--實(shí)例對象

instance對象就是通過類alloc出來的對象,每次調(diào)用alloc都會(huì)產(chǎn)生新的instance對象

instance對象在內(nèi)存中的存儲信息包括(參考NSobject本質(zhì))

 1.isa指針
 2.其他成員變量
image.png

2.class對象---類對象

一個(gè)類的類對象是唯一的,他們同一個(gè)對象,每個(gè)類在內(nèi)存中有且只有一個(gè)class對象

類對象在內(nèi)存中存儲的信息主要包括

1.isa指針
2.superclass指針
3.類的屬性信息(@property),類的對象方法信息
4.類的協(xié)議信息(protocol) ,類的成員變量信息(ivar)(不是成員變量的值,值存儲成員變量的描述信息,比如類 
   型,名稱),成員變量的值是存儲在實(shí)例對象里面的
image.png

3.meta-class對象--元類對象

Class objectMetaClass = object_getClass([NSObject class]);

通過runtime的object_getClass方法獲得元類對象

元類對象在內(nèi)存中存儲的信息主要包括

1. isa指針
2.superclass指針
3.類的類方法信息
image2.png

isa指針

對象的isa指針指向哪里?
instance對象的isa指向class對象,class對象的isa指向meta-class對象
(分析源碼發(fā)現(xiàn),實(shí)例對象的isa指針指向和class的內(nèi)存地址.class的isa指針指向meta-class的內(nèi)存地址)


image3.png

superclass指針

superclass看字面意思就是和繼承有關(guān)的,和父類有關(guān)

class對象的superclass指針

image5.png

meta-class對象的superclass指針

image4.png

isa和superclass的總結(jié)

一張圖總結(jié)


image.png

isa

1.instance的isa指向class
2.class的isa指向meta-class
3.meta-class的isa指向基類的meta-class

superclass

1.class的superclass指向父類的class,如果沒有父類,superclass指針為nil
2.meta-class的superclass指針指向父類的meta-class,基類的meta-class的superclass指向基類的class

instance調(diào)用對象方法的軌跡
isa找到class,方法不存在,就通過superclass找父類,一直往上找,知道找到,找不到就報(bào)錯(cuò),方法未定義

class調(diào)用類方法的軌跡
isa找meta-class,方法不存在,就通過superclass找父類,同樣一直往上找,如果基類也沒有找到類方法,會(huì)通過superclass知道基類的class尋找是否存在同名對象方法,如果找到,則不會(huì)報(bào)錯(cuò),會(huì)執(zhí)行對象方法(runtime的消息發(fā)送機(jī)制原因,msg_send)

舉個(gè)??

image.png

假定person繼承NSObject,student繼承person
1.實(shí)例對象調(diào)用方法的軌跡(紅色路線)
student調(diào)用study()方法,受限通過自己實(shí)例對象的isa指針找到class對象,(1),然后查看class對象有沒有study方法,沒有通過superclass指針往上找父類person有沒有方法,沒有在通過person的superclass往上找NSobject的class對象有沒有syudy方法,沒有機(jī)會(huì)報(bào)錯(cuò)unrecgnized selector

2.調(diào)用類方法的軌跡
首先class對象通過isa找到meta-class,查看是否有類方法,沒有,通過superclass找到父類person,查看person是否有類方法,沒有,在通過superclass找到NSObject查看是否有,沒有,就會(huì)找到NSObject的class對象,然后去找有沒有類方法,沒有的話,還會(huì)去找有沒有同名的對象方法,如果有的話,則不會(huì)報(bào)錯(cuò),會(huì)執(zhí)行對象方法,如果同名的對象方法也沒有,就報(bào)錯(cuò)

面試題:

1.對象的isa指針指向哪里?

instance對象的isa指向class對象,class對象的isa指向meta-class對象

2.OC的類信息存到到哪里?

對象方法,屬性,成員變量,協(xié)議,存放在class對象中
類方法存放在meta-class對象中
成員變量的具體值,存放在instance對象

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

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

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