NSMutableArray
是 的子类NSArray
,因此最简单的方法是将可变数组分配给(非可变)NSArray*
变量。但是,由于 Objective-C 的运行时动态性,如果您的代码格式不正确,您最终可能会意外地改变这个预期为静态的数组。如果您创建数组的非可变副本,任何此类意外调用都将导致程序崩溃。
NSMutableArray
的-copy
方法应该返回一个可变副本,所以我认为这不是你想要做的。您编写的最后两个选项在 ARC 的优化下是等效的;不同之处在于+arrayWithArray:
返回一个自动释放的对象,而-initWithArray:
返回一个保留的对象。
这是一个差异示例,如果您不小心调用了以下NSMutableArray
方法-removeAllObjects
:
NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:n];
for (int i = 0; i != n; ++i) {
// add object to tempArray
[tempArray addObject:[NSNumber numberWithInt:n];
}
// option 1:
[self setArray:tempArray];
[[self array] removeAllObjects]; // succeeds (that's bad)
// option 2:
[self setArray:[tempArray copy]];
[[self array] removeAllObjects]; // succeeds (that's bad)
// option 3:
NSArray *immutableArray = [[NSArray alloc] initWithArray:tempArray];
[self setArray:immutableArray];
[[self array] removeAllObjects]; // fails (that's good)
// if not ARC: [immutableArray release];
// option 4:
NSArray *immutableArray = [NSArray arrayWithArray:tempArray];
[self setArray:immutableArray];
[[self array] removeAllObjects]; // fails (that's good)