runtime數(shù)據(jù)結(jié)構(gòu)
- id = objc_object
isa_t
關(guān)于isa操作相關(guān)
弱引用相關(guān)
關(guān)聯(lián)對(duì)象相關(guān)
內(nèi)存管理相關(guān)
2.Class = objc_class 繼承自objc_Object,是一個(gè)(類)對(duì)象
Class superClass
cache_t cache(方法緩存)
class_data_bits_t (類的變量,屬性,和方法)
isa指針
共用體isa_t(64位或者32位置,0或者1的數(shù)字)
指針型isa,64位的0或者1,isa的值代表Class的地址
非指型isa,是指的是部分的值代表Class的地址
isa方向
- id對(duì)象,指向類對(duì)象
- 類對(duì)象,指向元類對(duì)象
如果我們調(diào)用一個(gè)方法,如果是實(shí)例對(duì)象是通過它的isa指針去他的類對(duì)象中查找;如果是類對(duì)象則是通過isa指針去他的元類對(duì)象中去查找。
cache_t
用于快速查找方法執(zhí)行的函數(shù)
是可增量擴(kuò)展的哈希表結(jié)構(gòu)
是計(jì)算機(jī)局部性原理的最佳應(yīng)用(把調(diào)用頻次更高的放在緩存池中)
是由bucket_t組成,里面有key(對(duì)應(yīng)SEL)和IMP(無類型的函數(shù)指針)
class_data_bits_t
是對(duì)class_rw_t的封裝。
class_rw_t代表了類相關(guān)的讀寫信息(類添加的分類、協(xié)議等),對(duì)class_ro_t 的封裝,代表累的相關(guān)的只讀信息。
class_rw_t的組成
class_ro_t
protocols
properties
methodsclass_ro_t的數(shù)據(jù)結(jié)構(gòu)(類原始定義,不是后來添加的)
name(可以反射獲得)
ivars(成員變量)
properties(屬性)
protocols(協(xié)議)
methodListsmethods
函數(shù)的四要素
名稱 - SEL name
返回值 - const char*types
參數(shù) - …
函數(shù)體 - IMP impTpye Encodings 機(jī)制,和const char*types相關(guān)
不可變的字符指針
返回值 參數(shù)1 參數(shù)2 … 參數(shù)n
- (void)aMethod <=> V@:
V 返回值void
@ 對(duì)象 id
: SEL
類對(duì)象和元類對(duì)象
類對(duì)象和元類什么關(guān)系和區(qū)別是什么?
- 類對(duì)象存儲(chǔ)實(shí)例方法列表等信息
- 元類對(duì)象存儲(chǔ)類方法列表等信息
實(shí)例對(duì)象可以通過isa指針找到他的類對(duì)象,訪問實(shí)例方法列表等信息。
類對(duì)象可以通過isa指針訪問元類對(duì)象找到類方法列表等信息。
類對(duì)象和元類的對(duì)象都是繼承自objc_class數(shù)據(jù)結(jié)構(gòu),所以都是有isa指針。
元類對(duì)象的isa指針都指向根元類對(duì)象,根元類對(duì)象的isa指針指向自己。
而根元類對(duì)象的父類指針指向根類對(duì)象,當(dāng)元類對(duì)象沒有這個(gè)方法的時(shí)候會(huì)去根類對(duì)象中找實(shí)例方法有沒有同名的方法。
總結(jié):調(diào)用的實(shí)例方法,會(huì)根據(jù)isa指針去找到類對(duì)象,在類對(duì)象中去遍歷方法實(shí)現(xiàn),沒有查找的話順著supperclass這真去找。
調(diào)用的類方法,會(huì)根據(jù)isa指針去找到元類對(duì)象,在元類對(duì)象中去遍歷方法實(shí)現(xiàn),沒有查找的話順著supperclass這真去找一直找到跟元類對(duì)象。
消息傳遞
supper是編譯關(guān)鍵字,super的數(shù)據(jù)結(jié)構(gòu)指的是當(dāng)前對(duì)象。所以supper的接收者是當(dāng)前對(duì)象。
·