核心概念
- NSArray:不可變,創建後內容固定
- NSMutableArray:可變,支持增刪改
- 只能存儲對象(
id),基本類型需用 NSNumber、NSValue 包裝
- 有序、下標訪問、允許
nil 作為結束標記(創建時)
NSArray 不可變數組
創建方式
// 單元素
NSArray *arr1 = [NSArray arrayWithObject:@"abc"];
// 多元素(以 nil 結尾)
NSArray *arr2 = [NSArray arrayWithObjects:@"one", @"two", nil];
// 從數組複製
NSArray *arr3 = [NSArray arrayWithArray:arr2];
// 從文件加載(屬性列表格式)
NSArray *arr4 = [NSArray arrayWithContentsOfFile:@"/path/to/file.plist"];
// 現代語法(字面量)
NSArray *arr5 = @[@"one", @"two", @"three"];
訪問與查詢
NSUInteger count = [arr2 count]; // 元素個數
id obj = [arr2 objectAtIndex:1]; // 下標訪問(越界拋異常)
id first = [arr2 firstObject]; // 首元素(安全,空返回 nil)
id last = [arr2 lastObject]; // 尾元素
BOOL contains = [arr2 containsObject:@"two"]; // 是否包含
NSUInteger idx = [arr2 indexOfObject:@"two"]; // 查找索引(未找到返回 NSNotFound)
派生新數組
// 追加元素返回新數組
NSArray *arr6 = [arr2 arrayByAddingObject:@"new"];
// 追加數組返回新數組
NSArray *arr7 = [arr2 arrayByAddingObjectsFromArray:arr3];
// 子數組
NSArray *sub = [arr2 subarrayWithRange:NSMakeRange(1, 2)];
// 連接為字符串
NSString *joined = [arr2 componentsJoinedByString:@","];
NSMutableArray 可變數組
創建
NSMutableArray *marr1 = [NSMutableArray array]; // 空
NSMutableArray *marr2 = [NSMutableArray arrayWithCapacity:5]; // 預留容量
NSMutableArray *marr3 = [NSMutableArray arrayWithObjects:@"a", @"b", nil];
修改操作
// 尾部添加
[marr3 addObject:@"c"];
// 指定位置插入
[marr3 insertObject:@"x" atIndex:1];
// 刪除
[marr3 removeLastObject]; // 刪除最後
[marr3 removeObject:@"a"]; // 刪除所有匹配對象
[marr3 removeObjectAtIndex:0]; // 刪除指定索引
[marr3 removeObjectsInRange:NSMakeRange(0,2)]; // 批量刪除
// 替換
[marr3 replaceObjectAtIndex:1 withObject:@"z"];
// 合併數組
[marr3 addObjectsFromArray:otherArray];
遍歷方式對比
| 方式 | 代碼 | 優點 | 缺點 |
| 下標遍歷 | for (i=0; i| 可控制索引、逆序、步長 | 略繁瑣 | |
| 快速枚舉 (推薦) | for (id obj in arr) { ... } | 語法簡潔、效率高、自動處理 nil | 不可在循環中修改數組 |
| 迭代器 | NSEnumerator *en=[arr objectEnumerator]; while(obj=[en nextObject]) | 可在循環中修改(部分情況) | 較舊式 |
| Block 遍歷 | [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){...}] | 支持並發、索引、提前終止 | Block 開銷 |
高級特性
- 排序:
[arr sortedArrayUsingSelector:@selector(compare:)] 或 sortedArrayUsingComparator:
- 過濾:
[arr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 3"]]
- 值變換:
[arr valueForKeyPath:@"name.uppercaseString"] (KVC)
- 線程安全:
NSArray 本身不可變故線程安全;NSMutableArray 非線程安全,需外部加鎖
性能提示
- 頻繁插入刪除頭部 → 改用
NSMutableArray 但注意 O(n) 移動開銷,或考慮鏈表
- 預知大致規模 →
arrayWithCapacity: 減少擴容
- 只讀場景優先用
NSArray + 字面量語法