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; // 打破循环引用