1. OC Runtime 类结构体变小了
在Runtime中,一个类原本由class_ro_t和class_rw_t两个结构体表示。class_ro_t是类中只读的部分,class_rw_t是类中可读写的部分。

为了减少冗余,最新的runtime在class_rw_t的基础上分出了class_rw_ext_t这个可选结构体,如果一个OC类没有动态性,可以节省这一部分内存。

2. OC method list的变化
新版runtime采用了Relative method lists的策略,即通过偏移量,可以将原来需要64比特表示的method地址改成只需要32比特表示。这样可以减少一半内存。

如果进行方法交换,那么通过偏移量表达的方法就失效了。这时候runtime会用一个全局表格记录交换的方法。

3. OC tagged pointers变化
OC tagged pointers可以利用指针地址的一部分保存一些比较小的数据结构,如NSNumber、NSDate,充分利用了指针地址。
原有的Tagged pointers分为Tag、Payload两部分,Tag用来标记这是什么类型,如NSDate, NSNumber等,Payload是用来保存类信息的地方。

新版的Tagged pointers结构如下,增加了Extended部分。这部分是给Swift语言使用定义Tagged pointers类型的。比如利用指针地址表示enum类型。

网友评论