NSArray 是 Foundation 框架中最基礎的集合類,提供有序、不可變的對象存儲。本文通過完整控制台示例,演示創建、訪問、遍歷三種方式、動態擴展生成新數組,並對比 Java 集合框架差異。
// main.m #importint main(int argc, const char * argv[]) { @autoreleasepool { // 1. 類方法創建不可變數組 (以 nil 結尾) NSArray *array = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; // 2. 兩種訪問方式 NSLog(@"The first element is %@", array[0]); // 下標語法 (現代) NSLog(@"The second element is %@", [array objectAtIndex:1]); // 消息語法 (傳統) // 3. 不可變數組「擴展」:實際返回新數組 NSArray *newArray = [array arrayByAddingObject:@"D"]; // 4. 三種遍歷方式對比 NSLog(@"=== for 索引遍歷 ==="); for (int i = 0; i < newArray.count; i++) { NSLog(@"The %d element is %@", i, newArray[i]); } NSLog(@"=== NSEnumerator 遍歷 ==="); NSEnumerator *enumerator = [newArray objectEnumerator]; id obj; while (obj = [enumerator nextObject]) { NSLog(@"The element is %@", obj); } NSLog(@"=== 快速枚舉 (推薦) ==="); for (id element in newArray) { NSLog(@"The element is %@", element); } } return 0; }
The first element is A The second element is B The 0 element is A The 1 element is B The 2 element is C The 3 element is D The element is A The element is B The element is C The element is D The element is A The element is B The element is C The element is D
NSArray 一旦創建,**內容、長度、順序均不可改變**String 或 List.of() 返回的不可變列表arrayByAddingObject:)實際返回**新實例**| 方式 | 語法 | 優點 | 缺點 |
|---|---|---|---|
| 索引 for 循環 | for(int i=0; i | 可控制索引、支持逆序、隨機訪問 | 代碼較繁瑣 |
| NSEnumerator | NSEnumerator *e = [arr objectEnumerator]; while(obj=[e nextObject]) | 早期 API、支持反向 reverseObjectEnumerator | 較繁瑣、需手動管理枚舉器 |
| 快速枚舉 | for(id obj in arr) | 語法最簡潔、性能最優、編譯器優化、防越界 | 需 C99 / Objective-C 2.0+ 支持 |
| 特性 | Objective-C | Java |
|---|---|---|
| 默認數組類 | NSArray **不可變** | ArrayList **可變** |
| 可變對應類 | NSMutableArray | ArrayList (默認即可變) |
| 不可變獲取 | 默認即不可變 | Collections.unmodifiableList() 或 Guava ImmutableList |
| 設計哲學 | **默認安全**,顯式選擇可變 | **默認靈活**,顯式選擇不可變 |
NSArray *arr = @[@"A", @"B", @"C"]; (自動補 nil,更簡潔)NSArray * (Xcode 7+),編譯期檢查元素類型NSArray 底層優化為 __NSArrayI (不可變) / __NSArrayM (可變),隨機訪問 O(1),記憶體連續NSArray 不可變天然線程安全;NSMutableArray 非線程安全,多線程需加鎖或用 dispatch_queue 序列化掌握 NSArray 的不可變語義與三種遍歷模式,是 Objective-C 開發的入門必修課。現代代碼請優先使用 @[] 字面量與 for-in 快速枚舉,編寫更安全、可讀、高效的集合處理代碼。