0
点赞
收藏
分享

微信扫一扫

WWDC-关于 runtime 的优化

拾光的Shelly 2021-09-19 阅读 61
iOS底层

前言

此次优化是 WWDC-2020 提出的,下面可自行观看视频:

关于 runtime 的改进优化

数据结构的变化(Class Data Structures Changes)

在磁盘上,在app的二进制文件中,类的结构如下:

对于类的对象本身,它包含最常访问的信息:

  • 指向元类、超类和方法缓存的指针。
  • 指向存储附加信息的更多数据的指针,称为 class_ro_t。其中 Ro 代表只读。

class_ro_t 包括类的名称以及方法、协议和实例变量的信息。并且 SwiftObjective-C共享这一基础结构。

Clean Memory 和 Dirty Memory

  • Clean Memory 是指加载后不会发生更改的内存。class_ro_t 就是属于 Clean Memory,因为它是只读的。

  • Dirty Memory 是指在进程运行时发生更改的内存。Class 一旦被使用就会变成 Dirty Memory,因为运行时会将新数据写入类中。

这也是 Class 数据被分成两部分的原因,可以保持干净的数据越多越好,分离出不改变的数据,存储为 Clean Memory

class_rw_t

虽然这些数据足以使用,但运行时需要跟踪有关每个类的更多信息,因此当类第一次被使用时,运行时还会为它分配额外的存储空间。

这个运行时分配的存储容量是 class_rw_t,用于读/写数据。在 class_rw_t 中,存储了只有在运行时才会生成的新信息。

class_rw_t 拆分

因为 class_rw_t 里面有太多的东西,会占用 很多 的内存。可以将 不常用 的部分拆分,分配到另一个扩展记录以供类使用。

因此拆分效果如图:

class_rw_t 与 class_ro_t 的区别

案例

占用内存如下:

总结:class_rw_ext_t 的拆分,可以节省内存开销。

举报

相关推荐

0 条评论