当前位置: 首页 > news >正文

iOS - 数组的真实类型

1. NSArray 类簇

// 1. __NSArray0 (空数组)
NSArray *empty = @[];// 2. __NSArrayI (不可变数组)
NSArray *immutable = @[@1, @2, @3];// 3. __NSArrayM (可变数组)
NSMutableArray *mutable = [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组)
NSArray *single = @[@"one"];// 5. __NSPlaceholderArray (占位数组)
NSArray *placeholder = [NSArray alloc]; // 未初始化

2. 具体类型特点

2.1 NSArray0

// 空数组单例
+ (id)array {return [NSArray alloc] init];  // 返回 __NSArray0 单例
}// 特点:
// 1. 共享单例
// 2. 零内存开销
// 3. 不可修改

2.2 _NSArrayI

// 不可变数组
NSArray *array = @[@1, @2, @3];// 特点:
// 1. 固定大小
// 2. 内存连续
// 3. 查找快速
// 4. 不支持修改

2.3 NSArrayM

// 可变数组
NSMutableArray *array = [NSMutableArray array];
[array addObject:@1];// 特点:
// 1. 动态大小
// 2. 支持增删改
// 3. 容量动态调整
// 4. 内存可能不连续

2.4 _NSSingleObjectArrayI

// 单元素数组优化
NSArray *array = @[@"one"];// 特点:
// 1. 专门优化的单元素存储
// 2. 内存效率高
// 3. 不可修改

2.5 NSConstantArray

// 单元素数组优化
NSArray *array = @[@"one"];// 特点:
// 1. 专门优化的单元素存储
// 2. 内存效率高
// 3. 不可修改// 只有使用 [NSArray arrayWithObj: obj]; 这种方式获取的对应为 _NSSingleObjectArrayI 类型

2.6 __NSFrozenArrayM

* 从可变数组copy到不可变数组时, 如果元素不超过5个,真实类型为 __NSArrayI
* 从可变数组copy到不可变数组时, 如果元素超过5个,真实类型为 __NSFrozenArrayM

3. 内存布局

3.1 不可变数组

struct __NSArrayI {Class isa;uint32_t _count;id _objects[]; // 柔性数组
};// 优点:
// 1. 内存连续
// 2. 访问效率高

3.2 可变数组

struct __NSArrayM {Class isa;uint32_t _count;uint32_t _capacity;id *_objects; // 指针数组
};// 特点:
// 1. 动态扩容
// 2. 内存可能分散

4. 性能特征

4.1 查找性能

// 1. 随机访问
array[index];  // O(1)// 2. 查找元素
[array indexOfObject:obj];  // O(n)

4.2 修改性能

// 1. 添加元素
[mutableArray addObject:obj];  // 平均 O(1),最坏 O(n)// 2. 插入元素
[mutableArray insertObject:obj atIndex:0];  // O(n)// 3. 删除元素
[mutableArray removeObjectAtIndex:0];  // O(n)

5. 使用建议

5.1 类型选择

// 1. 固定内容用不可变
NSArray *constants = @[@1, @2, @3];// 2. 动态内容用可变
NSMutableArray *dynamic = [NSMutableArray array];// 3. 空数组用单例
NSArray *empty = @[];

5.2 性能优化

// 1. 预分配容量
NSMutableArray *array = [NSMutableArray arrayWithCapacity:expectedCount];// 2. 批量操作
[array addObjectsFromArray:objects];  // 比循环添加效率高// 3. 避免频繁调整大小
if ([array count] == 0) {array = [NSMutableArray arrayWithCapacity:100];
}

5.3 内存管理

// 1. 大数组及时释放
@autoreleasepool {NSMutableArray *largeArray = [NSMutableArray array];// 处理大量数据
}// 2. 注意循环引用
array = nil;  // 打破循环引用

http://www.lryc.cn/news/516594.html

相关文章:

  • k8s启动报错
  • git:指令集
  • 自闭症家庭:建立支持系统与平衡生活
  • html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)
  • 高阶知识库搭建实战七、(知识库雏形开发:qianwen-plus+Faiss)(练习推荐)
  • 麒麟服务器安装kafka--亲测
  • 微机——8086微处理器的数据传送指令
  • vue3中onUpdated钩子函数和nextTick的具体使用场景和区别
  • colnames看似简单,却能优化数据处理流程
  • 欧几里得距离在权重矩阵中的物理意义
  • AI编程辅助开发网站
  • 「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
  • 基于单片机洗衣机控制器的设计(论文+源码)
  • 【Git系列】解析与解决Git错误:RPC失败;curl 56 OpenSSL SSL_read: error:140943FC
  • [Unity Shader] 【游戏开发】Unity基础光照1-光照模型原理
  • 基于Python 的宠物管理系统(源码+部署)
  • console.log封装
  • 戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
  • GitLab创建用户,设置访问SSH Key
  • Mysql--基础篇--SQL(DDL,DML,窗口函数,CET,视图,存储过程,触发器等)
  • 比较 FreeSWITCH 的 asr 事件和回调函数
  • 基于ffmpeg和sdl2的简单视频播放器制作
  • 卫星导航信号的形成及解算
  • 硬件-射频-PCB-常见天线分类-ESP32实例
  • salesforce 验证规则判断一个picklist是否为none
  • 解决 IntelliJ IDEA 中 Tomcat 日志乱码问题的详细指南
  • 如何分析 Nginx 日志
  • Kubernetes Gateway API-5-后端协议和网关基础设置标签
  • 大数据架构演变
  • Bash语言的软件工程