Objective-C 陣列 (NSArray/NSMutableArray) 是儲存物件的核心容器,支援字面量語法、快速枚舉、關鍵值編碼等現代特性。
NSArray *arr1 = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];
NSArray *arr2 = @[@"one", @"two", @"three"]; NSArray *arr3 = @[@"one", @"two", @(42)]; // 混合類型:自動装箱
陣列只能儲存 物件指標,基本類型需包裝為 NSNumber / NSValue:
// NSNumber 工廠方法
@(42) // 整數 -> NSNumber
@(3.14) // 浮點數 -> NSNumber
@(YES) // 布林 -> NSNumber
@('c') // 字元 -> NSNumber
// 等同於
[NSNumber numberWithInt:42];
[NSNumber numberWithDouble:3.14];
[NSNumber numberWithBool:YES];
[NSNumber numberWithChar:'c'];
// 解箱
int i = [num intValue];
double d = [num doubleValue];
BOOL b = [num boolValue];
char c = [num charValue];
NSArray *inner1 = @[@"a", @"b"]; NSArray *inner2 = @[@1, @2, @3]; NSArray *nested = @[inner1, inner2]; // 陣列的陣列 // 存取巢狀元素 NSString *val = nested[1][2]; // @"3" (自動轉型)
@interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSInteger age; - (instancetype)initWithName:(NSString *)name age:(NSInteger)age; @end
@implementation Person
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
self = [super init];
if (self) {
_name = name;
_age = age;
}
return self;
}
// 重寫 description 方便 NSLog 列印
- (NSString *)description {
return [NSString stringWithFormat:@"姓名:%@ 年齡:%ld", _name, (long)_age];
}
@end
Person *p1 = [[Person alloc] initWithName:@"Jack" age:15];
Person *p2 = [[Person alloc] initWithName:@"Tom" age:20];
Person *p3 = [[Person alloc] initWithName:@"Dick" age:16];
NSArray *people = @[p1, p2, p3];
// 存取
Person *p = people[1]; // 現代下標語法
NSLog(@"%@", p); // 自動呼叫 description
// 遍歷
for (Person *person in people) {
NSLog(@"%@", person);
}
// 包含檢查
BOOL hasJack = [people containsObject:p1]; // YES
| 操作 | 不可變 | 可變 |
|---|---|---|
| 建立 | @[...] | [NSMutableArray array] |
| 元素數量 | [arr count] | arr.count |
| 索引存取 | arr[i] | arr[i] |
| 查找索引 | [arr indexOfObject:obj] | 同左 |
| 包含檢查 | [arr containsObject:obj] | 同左 |
| 新增元素 | 不可 | [marr addObject:obj] |
| 插入元素 | 不可 | [marr insertObject:obj atIndex:i] |
| 移除元素 | 不可 | [marr removeObject:obj] |
| 快速枚舉 | for (id obj in arr) | 同左 |
| 排序 | [arr sortedArrayUsingComparator:^] | [marr sortUsingComparator:^] |
| 過濾 | [arr filteredArrayUsingPredicate:] | 同左 |
addObject: 傳入 retain,移除時 releaseNSArray:優化為不可變,記憶體緊湊、執行緒安全、複製極快 (Copy-on-Write)NSMutableArray:動態陣列,尾部新增 O(1) 攤還,頭部插入 O(n)NSCache 或 Core Data / SQLite