NSMutableArray实现方式(2)

2019-05-22  本文已影响0人  zhong_JF

先来分析第一点:

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才会立即释放

总结:

ios中使用了环形缓存器优化了每次增删元素的性能
tips:可能总结的不够完整,望大佬们补充指导一下
上一篇下一篇

猜你喜欢

热点阅读