1. OC Runtime 類結(jié)構(gòu)體變小了
在Runtime中芝雪,一個(gè)類原本由class_ro_t和class_rw_t兩個(gè)結(jié)構(gòu)體表示旁理。class_ro_t是類中只讀的部分点骑,class_rw_t是類中可讀寫的部分匾委。
截屏2020-07-19 00.25.34.png
為了減少冗余需忿,最新的runtime在class_rw_t的基礎(chǔ)上分出了class_rw_ext_t這個(gè)可選結(jié)構(gòu)體,如果一個(gè)OC類沒有動(dòng)態(tài)性蜡歹,可以節(jié)省這一部分內(nèi)存屋厘。
截屏2020-07-19 00.27.07.png
2. OC method list的變化
新版runtime采用了Relative method lists的策略,即通過偏移量月而,可以將原來需要64比特表示的method地址改成只需要32比特表示汗洒。這樣可以減少一半內(nèi)存。
截屏2020-07-19 00.35.29.png
如果進(jìn)行方法交換父款,那么通過偏移量表達(dá)的方法就失效了溢谤。這時(shí)候runtime會(huì)用一個(gè)全局表格記錄交換的方法。
截屏2020-07-19 00.37.15.png
3. OC tagged pointers變化
OC tagged pointers可以利用指針地址的一部分保存一些比較小的數(shù)據(jù)結(jié)構(gòu)憨攒,如NSNumber世杀、NSDate,充分利用了指針地址肝集。
原有的Tagged pointers分為Tag瞻坝、Payload兩部分,Tag用來標(biāo)記這是什么類型杏瞻,如NSDate, NSNumber等催烘,Payload是用來保存類信息的地方舟陆。
截屏2020-07-19 00.46.20.png
新版的Tagged pointers結(jié)構(gòu)如下篮愉,增加了Extended部分。這部分是給Swift語言使用定義Tagged pointers類型的忧吟。比如利用指針地址表示enum類型。
截屏2020-07-19 00.47.42.png