先来分析第一点:
C动态数组实现的缺点
1、如果有一个数据插入,数组空间不够则需要重新申请内存,所有数据都要移动一次
2、插入删除,数据存储位置都要变化
3、申请大的空间可能会申请失败
先来分析第二点:
NSMutableArray实现方式
@interface __NSArrayM : NSMutableArray
{
unsigned long long _used; // 当前对象数目
unsigned long long _doHardRetain:1;
unsigned long long _doWeakAccess:1;
unsigned long long _size:62; // 已分配的_list大小(能存储的对象个数,不是字节数)
unsigned long long _hasObjects:1;
unsigned long long _hasStrongReferences:1;
unsigned long long _offset:62; // 实际对象数组的起始偏移
unsigned long long _mutations; // 修改标记,每次对__NSArrayM的修改操作都会使_mutations加1
id *_list; // 实际内存的起始地址
}
几个主要变量:
offset: 有效数据起始位置偏移量
size: 实际占用的内存大小
used: 数组的实际的有效数据个数
*list: 实际内存的起始地址
重要概念:
环形缓存器
插入元素:
当buff size还够用的时候,数据会在末端添加进去,修改offser+1和user+1
当buff size不够用的时候,会扩容为原理的1.625倍
删除元素:
直接修改offset和used就可以
注意:
数组内容移除后,缓冲区空间并未立即释放,需要手动把数组置为nil才会立即释放
网友评论