iOS类里面的数据为什么要分为ro、rw、rwe?

1,902 阅读2分钟

和谐学习!不急不躁!!我是你们的老朋友小青龙~

抛出问题

我们经常会听到说,在实际运行中,类里面的数据存在于ro、rw,甚至冒出一个rwe的概念呢,这些都是什么意思呢?存在的意义又是什么??

内存概念

在iOS里,内存分为两种:

  • clean Memory 指的是加载后不会发生变化的内存

  • dirty Memory 指的是进程运行时会发生改变的内存

dirty Memory比clean Memory更昂贵,因为前者一经使用就必须一直存在。
昂贵指的是性价比,同样容量大小的内存,就造价而言,iOS上需要花费的成本要比Mac上花费的成本要多得多)

因为iOS不使用swap,所以dirty Memory在iOS里的代价很大。

clean Memory可以进行移除,从而节省更多内存空间。

因为clean Memory和dirty Memory的存在,所以类的数据被分成两部分

  • 一经编译,就不可修改的数据。(ro)
  • 运行过程中可修改的数据。(rw)

ro、rw、rwe

ro:数据是只读的,所以它属于clean Memory
(它是从沙盒读取,ro的数据在编译的时候就已经确定了。)

rw:数据是可读可写的,所以它属于dirty Memory
(rw的数据存放的是运行时动态修改的数据)

rwe:前面我们提到了rw存在的那片内存属于dirty Memory,而dirty Memory在iOS里的代价很大,我们应该尽可能减少rw里的数据存在。
这时候,引出了rwe的概念,它是对rw的拓展,目的是为了优化rw。因为并不是每个类都会在运行时改变属性、方法、协议。而rwe会标记处理,针对那些不需要改变内容的数据,就去ro读取,那些需要改变内容的就去rw读取。

类的内存结构

image.png

通过First SubclassNext Sibling Class这两个指针,将所有类链接成一个树状结构,这允许运行时遍历所有的使用类。

由于运行时的存在,Methods、Protocols、Properties都是可以通过category手动使用API,动态添加、修改,所以rw里也存了一份这些数据。