在 Objective-C 開發中,NSMutableArray 是處理動態集合的核心工具。與不可變的 NSArray 不同,它允許在運行時靈活增刪元素,極大地提升了資料處理的靈活性。本文將透過實際程式碼示範,詳細解析可變陣列的建立方式、常用操作方法以及注意事項。
#importint main(int argc, const char * argv[]) { @autoreleasepool { // 1. 使用現代語法建立不可變陣列 NSArray *array = @[@1, @2, @3]; // 2. 以不可變陣列初始化可變陣列(深拷貝) NSMutableArray *array2 = [[NSMutableArray alloc] initWithArray:array]; // 3. 指定索引插入元素(索引必須小於 count) NSString *str1 = @"one"; [array2 insertObject:str1 atIndex:2]; NSLog(@"插入後: %@", array2); // 4. 新增元素至陣列尾端 [array2 addObject:str1]; NSLog(@"新增後: %@", array2); // 5. 移除所有元素 [array2 removeAllObjects]; // 6. 重新新增元素驗證 NSString *str4 = @"4"; [array2 addObject:str4]; NSLog(@"重置後: %@", array2); /* // 錯誤示範:遍歷過程中移除元素會導致崩潰 for(NSString *str in array2) { [array2 removeObjectAtIndex:0]; // 危險操作! } */ } return 0; }
@[@1, @2, @3] 快速建立 NSArray,語法簡潔且型別安全initWithArray: 建立深拷貝,原陣列變更不影響新陣列insertObject:atIndex: 要求索引值範圍為 0 ~ count。若索引等於 count,相當於尾端新增;超出範圍將拋出 NSRangeException。
ARC 環境下,陣列持有元素的強參考。removeAllObjects 會釋放所有元素持有權,但不會釋放陣列本身的記憶體空間(capacity 保留),後續新增元素可復用空間,效能更佳。
註解掉的 for-in 迴圈展示經典錯誤:快速枚舉期間修改集合會導致程式崩潰。正確做法包括:
for (id obj in [array copy])for (NSUInteger i = array.count; i-- > 0;)| 操作 | 方法 | 時間複雜度 | 備註 |
|---|---|---|---|
| 尾端新增 | addObject: | O(1) 摊銷 | 最常用、效能最佳 |
| 指定位置插入 | insertObject:atIndex: | O(n) | 需移動後續元素 |
| 指定位置刪除 | removeObjectAtIndex: | O(n) | 需移動後續元素 |
| 依值刪除 | removeObject: | O(n) | 會移除所有相等物件 |
| 清空陣列 | removeAllObjects | O(n) | 保留容量空間 |
掌握 NSMutableArray 的核心操作與陷阱,是寫出高效、穩定 Objective-C 程式的基石。實際開發中,建議優先使用字面量語法、善用 copy 防禦式程式設計、避免在快速枚舉中修改集合,即可規避 90% 的常見問題。