首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C NSArray/NSMutableArray 完全指南:創建、訪問、修改、遍歷、高級用法

     編輯:關於C語言

核心概念

  • 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 + 字面量語法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved