iOS - 数组的真实类型

1. NSArray 类簇

objectivec 复制代码
// 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

objectivec 复制代码
// 空数组单例
+ (id)array {
    return [NSArray alloc] init];  // 返回 __NSArray0 单例
}

// 特点:
// 1. 共享单例
// 2. 零内存开销
// 3. 不可修改

2.2 _NSArrayI

objectivec 复制代码
// 不可变数组
NSArray *array = @[@1, @2, @3];

// 特点:
// 1. 固定大小
// 2. 内存连续
// 3. 查找快速
// 4. 不支持修改

2.3 NSArrayM

objectivec 复制代码
// 可变数组
NSMutableArray *array = [NSMutableArray array];
[array addObject:@1];

// 特点:
// 1. 动态大小
// 2. 支持增删改
// 3. 容量动态调整
// 4. 内存可能不连续

2.4 _NSSingleObjectArrayI

objectivec 复制代码
// 单元素数组优化
NSArray *array = @[@"one"];

// 特点:
// 1. 专门优化的单元素存储
// 2. 内存效率高
// 3. 不可修改

2.5 NSConstantArray

objectivec 复制代码
// 单元素数组优化
NSArray *array = @[@"one"];

// 特点:
// 1. 专门优化的单元素存储
// 2. 内存效率高
// 3. 不可修改

// 只有使用 [NSArray arrayWithObj: obj]; 这种方式获取的对应为 _NSSingleObjectArrayI 类型

2.6 __NSFrozenArrayM

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

3. 内存布局

3.1 不可变数组

objectivec 复制代码
struct __NSArrayI {
    Class isa;
    uint32_t _count;
    id _objects[]; // 柔性数组
};

// 优点:
// 1. 内存连续
// 2. 访问效率高

3.2 可变数组

objectivec 复制代码
struct __NSArrayM {
    Class isa;
    uint32_t _count;
    uint32_t _capacity;
    id *_objects; // 指针数组
};

// 特点:
// 1. 动态扩容
// 2. 内存可能分散

4. 性能特征

4.1 查找性能

objectivec 复制代码
// 1. 随机访问
array[index];  // O(1)

// 2. 查找元素
[array indexOfObject:obj];  // O(n)

4.2 修改性能

objectivec 复制代码
// 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 类型选择

objectivec 复制代码
// 1. 固定内容用不可变
NSArray *constants = @[@1, @2, @3];

// 2. 动态内容用可变
NSMutableArray *dynamic = [NSMutableArray array];

// 3. 空数组用单例
NSArray *empty = @[];

5.2 性能优化

objectivec 复制代码
// 1. 预分配容量
NSMutableArray *array = [NSMutableArray arrayWithCapacity:expectedCount];

// 2. 批量操作
[array addObjectsFromArray:objects];  // 比循环添加效率高

// 3. 避免频繁调整大小
if ([array count] == 0) {
    array = [NSMutableArray arrayWithCapacity:100];
}

5.3 内存管理

objectivec 复制代码
// 1. 大数组及时释放
@autoreleasepool {
    NSMutableArray *largeArray = [NSMutableArray array];
    // 处理大量数据
}

// 2. 注意循环引用
array = nil;  // 打破循环引用
相关推荐
zwd20053 小时前
词频是什么?生词滑块 zipf 3.0 到 5.0 怎么调:同一屏从 0 个生词到 11 个
ios·iphone·效率工具·英语学习·词频·屏幕翻译
茶底世界之下7 小时前
灯暖窗冷,色温要不要继续降?用 Awaking 看混合光的取舍
ios
2501_9160074711 小时前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
最强小杰14 小时前
gpt-image-2.5-sunburst + OpenAI SDK + Cline 怎么接?完整图生图与局部重绘教程
gpt·ios·ai·iphone
kk_net889914 小时前
FSNotes:macOS 和 iOS 上的开源笔记管理器
笔记·其他·macos·ios
00后程序员张14 小时前
Windows 开发 iOS App 入门,用 SwiftUI 写第一个 iOS App 装到 iPhone
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_915106321 天前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
andyweike1 天前
Swift
开发语言·ios·swift
茶底世界之下1 天前
白杯偏蓝,色温调到哪里该停?Awaking 两版正式导出
ios
2501_915921432 天前
KXBuild CI 实操,Windows/Linux 服务器接入 Jenkins 打包 iOS IPA
服务器·windows·vscode·ios·ci/cd·个人开发·敏捷流程