Objective-C是一門動(dòng)態(tài)性比較強(qiáng)的編程語(yǔ)言惰拱,跟C淮逊、C++等語(yǔ)言有著很大的不同袱耽,Object-C的函數(shù)調(diào)用不是在編譯時(shí)期決定的,而是在運(yùn)行時(shí)決定的据途。Objective-C的動(dòng)態(tài)性是由Runtime API來支撐的绞愚,Runtime API提供的接口基本都是C語(yǔ)言的,源碼由C\C++\匯編語(yǔ)言編寫颖医。
isa詳解
在arm64架構(gòu)之前位衩,isa就是一個(gè)普通的指針,存儲(chǔ)著Class熔萧、Meta-Class對(duì)象的內(nèi)存地址糖驴,從arm64架構(gòu)開始,對(duì)isa進(jìn)行了優(yōu)化佛致,變成了一個(gè)共用體(union)結(jié)構(gòu)贮缕,還使用位域來存儲(chǔ)更多的信息
isa位域
nonpointer
0,代表普通的指針俺榆,存儲(chǔ)著Class感昼、Meta-Class對(duì)象的內(nèi)存地址
1,代表優(yōu)化過罐脊,使用位域存儲(chǔ)更多的信息
has_assoc
是否有設(shè)置過關(guān)聯(lián)對(duì)象定嗓,如果沒有,釋放時(shí)會(huì)更快
has_cxx_dtor
是否有C++的析構(gòu)函數(shù)(.cxx_destruct)萍桌,如果沒有宵溅,釋放時(shí)會(huì)更快
shiftcls
存儲(chǔ)著Class、Meta-Class對(duì)象的內(nèi)存地址信息
magic
用于在調(diào)試時(shí)分辨對(duì)象是否未完成初始化
weakly_referenced
是否有被弱引用指向過上炎,如果沒有恃逻,釋放時(shí)會(huì)更快
deallocating
對(duì)象是否正在釋放
extra_rc
里面存儲(chǔ)的值是引用計(jì)數(shù)器減1
has_sidetable_rc
引用計(jì)數(shù)器是否過大無法存儲(chǔ)在isa中
如果為1,那么引用計(jì)數(shù)會(huì)存儲(chǔ)在一個(gè)叫SideTable的類的屬性中
Class的結(jié)構(gòu)
Class的本質(zhì)是一個(gè)objc_class的結(jié)構(gòu)體,結(jié)構(gòu)體內(nèi)包含指向原類的Class isa
指針辛块,指向父類的Class superclass
指針,緩存方法列表cache_t cache
铅碍,類信息class_data_bits_t bits
润绵,bits & FAST_DATA_MASK
得到class_rw_t
結(jié)構(gòu)體,class_rw_t結(jié)構(gòu)體包含method_list_t * methods
方法列表 property_list_t * properties
屬性列表 const protocol_list_t * protocols
等信息胞谈,還包含一個(gè)特殊的結(jié)構(gòu)體指針就是const class_ro_t
class_ro_t是類最原始的類信息尘盼,是只讀的結(jié)構(gòu)體,包含最開始的類名烦绳、成員變量類標(biāo)卿捎、方法列表、協(xié)議列表等信息径密。
初始化class_rw_t結(jié)構(gòu)體時(shí)會(huì)將class_ro_t結(jié)構(gòu)體里的方法列表和協(xié)議列表等信息復(fù)制到class_rw_t結(jié)構(gòu)體內(nèi)午阵,通過runtime添加的屬性和方法也都是添加到class_rw_t結(jié)構(gòu)體內(nèi)。
class_rw_t里面的methods享扔、properties底桂、protocols是二維數(shù)組,是可讀可寫的惧眠,包含了類的初始內(nèi)容籽懦、分類的內(nèi)容
class_ro_t里面的baseMethodList、baseProtocols氛魁、ivars暮顺、baseProperties是一維數(shù)組,是只讀的秀存,包含了類的初始內(nèi)容
method_t結(jié)構(gòu)體是對(duì)方法\函數(shù)的封裝捶码,包含SEL name
const char * types
IMP imp
- IMP代表函數(shù)的具體實(shí)現(xiàn)
- SEL代表方法\函數(shù)名,一般叫做選擇器或链,底層結(jié)構(gòu)跟char *類似可以通過@selector()和sel_registerName()獲得宙项,可以通過sel_getName()和NSStringFromSelector()轉(zhuǎn)成字符串,不同類中相同名字的方法株扛,所對(duì)應(yīng)的方法選擇器是相同的
- types包含了函數(shù)返回值尤筐、參數(shù)編碼字符串