Xcode 12 Runtime的改进

1. OC Runtime 类结构体变小了

在Runtime中,一个类原本由class_ro_tclass_rw_t两个结构体表示。class_ro_t是类中只读的部分,class_rw_t是类中可读写的部分。

截屏2020-07-19 00.25.34.png

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

截屏2020-07-19 00.27.07.png

2. OC method list的变化

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


截屏2020-07-19 00.35.29.png

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


截屏2020-07-19 00.37.15.png

3. OC tagged pointers变化

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


截屏2020-07-19 00.46.20.png

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


截屏2020-07-19 00.47.42.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容