美文网首页
iOS重学之class_rw_ext_t结构详解

iOS重学之class_rw_ext_t结构详解

作者: 重庆妹子在霾都 | 来源:发表于2022-11-23 12:47 被阅读0次

写在前面

iOS重学之窥探Class的结构这篇文章中,我们分析Class的结构时提到了一个结构class_rw_ext_t,本文主要就这个结构来展开做个详细的分析,以及苹果为什么要这么做。

class_rw_ext_t结构

简单介绍

在WWDC2020中苹果介绍对类的修改时出现了一个新的结构:class_rw_ext_t,这个结构主要是Runtime在内存上做的一些优化而出现的,在苹果源码objc4_781版本开始出现class_rw_ext_t,大家也可以对照源码来阅读本文。

clean memory 和 dirty memory

clean memory:加载后不会再发生变化的内存。
dirty memory:指的是在进程运行时会发生更改的内存。

提示
dirty memory会比clean memory更加消耗性能和内存,dirty memory是只要进程在运行,它就必须一直存在,而clean memory可以在内存吃紧的时候移除来节省更多的内存空间,在需要的时候再次从磁盘中进行加载。

class_rw_t 和 class_ro_t

class_rw_ext_t结构之前,整体Class 结构是:

1.png
从上面的结构我们可以看到Class结构被拆分为两部分:class_rw_tclass_ro_t,这么拆分的原因就是为了保持更多的clean memory,从而节省内存空间,其中class_rw_t是dirty memory,而class_ro_t就是clean memory。

解释
在没有class_rw_ext_t结构之前,当一个类被装载到内存中时就会初始化一个class_rw_t结构,并将class_ro_t结构中MethodsPropertiesProtocols数据复制到class_rw_t中,我们上面提到过class_rw_t属于dirty memory,在程序运行的时候这块内存就必须一直存在,但是大概90%的类并不需要对其中的Methods进行修改,所以这部分的内存其实就是属于浪费,于是苹果拆分出来一个新的数据结构:class_rw_ext_t

class_rw_ext_t结构之后,整体Class结构是:

2.png
从上面的结构图看到:苹果尽可能的减少dirty memory的大小来降低内存开销。他把MethodsPropertiesProtocolsDemangled Name拆分到新的结构class_rw_ext_t中,这里的ext可以理解为extension(扩展)。

解释
在有了class_rw_ext_t结构之后,当一个类被装载到内存中时就会初始化一个class_rw_t结构,但是并不会把class_ro_t中的相关数据完全复制到其中,这样就减少了class_rw_t的大小,利用懒加载的机制在确实需要额外的类的信息的时候再去初始化class_rw_ext_t结构来存放这些信息。

验证内存变化

使用命令heap xxx | egrep 'class_rw|COUNT'来查看一些进程中class_rw类的内存情况,博主这里以微信和Xcode为例来看看:

3.png
从上图看到:
WeChat中一共有6418个class_rw_t类,但是真的需要额外扩展class_rw_ext_t的只有474个,这个比例大概是7%,我们大概计算一下节省的内存:(6418 - 474) * 48 = 285312(B)。
Xcode中一共有15674个class_rw_t类,但是真的需要额外扩展class_rw_ext_t的只有2375个,这个比例大概是15%,节省的内存:(15674 - 2375) * 48 = 638352(B)。
对dirty memory而言,这是真正节省的内存,所以这个优化还是很可观的。

查找方法的变化

class_rw_ext_t结构之前,runtime是直接遍历class_rw_t中的方法列表来查找方法,具体如下图:

4.png
5.png

class_rw_ext_t结构之后,runtime查找方法的方式如下图:

6.png
7.png

写在最后

关于class_rw_ext_t结构的分析和好处我们就分析到这里了,如果有什么不对的地方望指教,欢迎到我的个人博客逛逛。

相关文章

  • iOS重学之class_rw_ext_t结构详解

    写在前面 在iOS重学之窥探Class的结构[https://codersunny.com/posts/b55a1...

  • IOS学习(9)-UITabBarController

    iOS开发UI篇—UITabBarController简单介绍视图之UITabBarController结构详解(...

  • iOS重学之KVC详解

    KCV的基本使用 KVC的设值原理 解释:1、当存在setKey方法时,调用setKey。2、当setKey方法不...

  • iOS重学之KVO详解

    KVO的基本使用 基本使用 KVO:Key Value Observing(键值监听),用来监听某个对象属性值的改...

  • 数据结构和算法

    1.哈希表哈希算法详解(附带 iOS 开发中实际应用) 2.链表iOS 数据结构之链表

  • iOS Block实例

    iOS之Block详解:Block详解 ViewController.h(ARC) ViewController....

  • 2021-08-25

    iOS swift SDK详解之NSCoding协议 详解:NSCoding是对iOS中的Model类进行编码和解...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • iOS重学之窥探Class的结构

    写在前面 本文主要探究Class的内部结构,博主这里使用的objc4的源码版本是objc4-838,建议大家在看的...

  • CGAffineTransform

    参考: iOS形变之CGAffineTransform iOS 仿射变换CGAffineTransform详解 如...

网友评论

      本文标题:iOS重学之class_rw_ext_t结构详解

      本文链接:https://www.haomeiwen.com/subject/mdszxdtx.html