美文网首页
NSMutableArray实现方式(2)

NSMutableArray实现方式(2)

作者: zhong_JF | 来源:发表于2019-05-22 12:15 被阅读0次

    先来分析第一点:

    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:可能总结的不够完整,望大佬们补充指导一下

    相关文章

      网友评论

          本文标题:NSMutableArray实现方式(2)

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