注:文章為自己學(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.其他成員變量

2.class對象---類對象
一個(gè)類的類對象是唯一的,他們同一個(gè)對象,每個(gè)類在內(nèi)存中有且只有一個(gè)class對象
類對象在內(nèi)存中存儲的信息主要包括
1.isa指針
2.superclass指針
3.類的屬性信息(@property),類的對象方法信息
4.類的協(xié)議信息(protocol) ,類的成員變量信息(ivar)(不是成員變量的值,值存儲成員變量的描述信息,比如類
型,名稱),成員變量的值是存儲在實(shí)例對象里面的

3.meta-class對象--元類對象
Class objectMetaClass = object_getClass([NSObject class]);
通過runtime的object_getClass方法獲得元類對象
元類對象在內(nèi)存中存儲的信息主要包括
1. isa指針
2.superclass指針
3.類的類方法信息

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

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

meta-class對象的superclass指針

isa和superclass的總結(jié)
一張圖總結(jié)

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è)??

假定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對象