| 類別 | 有序性 | 鍵值結構 | 元素唯一性 | 典型用途 |
| NSArray / NSMutableArray | ✅ 有序 | ❌ 索引 | ❌ 可重複 | 有序列表、棧、隊列 |
| NSSet / NSMutableSet | ❌ 無序 | ❌ 無 | ✅ 唯一 | 去重、集合運算、快速查找 |
| NSDictionary / NSMutableDictionary | ❌ 無序 | ✅ Key-Value | Key 唯一,Value 可重複 | 映射表、配置、緩存 |
二、不可變 vs 可變
- 不可變(
NSArray、NSSet、NSDictionary):創建時初始化,之後不可修改,線程安全(只讀)。
- 可變(
NSMutableArray 等):運行時動態增刪,非線程安全,需自行同步。
三、核心 API 速查
1. NSMutableArray
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:@"good"]; // 尾部添加
[arr removeObject:@"good"]; // 刪除所有匹配項
id obj = arr[index]; // 現代下標訪問(等價 objectAtIndex:)
2. NSSet
NSSet *set = [NSSet setWithObjects:@"1",@"2",@"3",@"4",@"5",@"6", nil];
NSString *random = [set anyObject]; // 隨機取一個元素(擲骰子)
// 無下標訪問,需遍歷或轉數組
3. NSMutableDictionary
NSMutableDictionary *dict = [@{@"name": @"lili"} mutableCopy];
[dict setObject:@"rose" forKey:@"name"]; // 覆蓋同 key 值
[dict setObject:@"北京" forKey:@"address"]; // 新增鍵值對
// [dict removeObjectForKey:@"name"]; // 刪除
id value = dict[@"name"]; // 現代下標訪問
四、共同限制
- 只能存放 Objective-C 對象(
id 類型)。
- 基本數據類型需包裝:
@(123)、[NSNumber numberWithInt:123]。
nil 不能作為元素/值存入(作為列表結束標記)。
五、線程安全提示
- 不可變集合天生線程安全(只讀)。
- 可變集合非線程安全,多線程環境需加鎖(
@synchronized、NSLock、GCD 隊列串行化)或使用第三方線程安全容器。
六、現代語法糖
// 字面量創建(編譯器自動轉調用對應構造方法)
NSArray *arr = @[@"a", @"b", @"c"];
NSDictionary *dict = @{@"key": @"value"};
NSSet *set = @[@"a", @"b", @"c"]; // 實際調用 +setWithObjects:count:
七、總結
根據「是否需要順序」「是否需要 Key-Value」「是否需要去重」「是否需要動態修改」四個維度選擇集合類。現代開發優先使用字面量語法創建不可變集合,再按需 mutableCopy 轉可變,代碼更簡潔安全。
- 上一篇文章: C語言字符串比較函數實現與指針數組vs數組指針區別詳解
- 下一篇文章: C 語言條件編譯完全指南:#undef、#ifdef、#if、#error 實戰
Copyright ©
程式碼之家 All Rights Reserved