和谐学习!不急不躁!!我是你们的老朋友小青龙~
抛出问题
我们经常会听到说,在实际运行中,类里面的数据存在于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读取。
类的内存结构
通过First Subclass
和Next Sibling Class
这两个指针,将所有类链接成一个树状结构,这允许运行时遍历所有的使用类。
由于运行时
的存在,Methods、Protocols、Properties都是可以通过category
或手动使用API
,动态添加、修改,所以rw里也存了一份这些数据。