正如 Joseph DeCarlo 所说,如果您唯一要做的就是在一个地方创建数组以在其他地方使用它,那么您不需要复制NSMutableArray
到。NSArray
例如,此语句是有效的:
NSArray* newArray = [NSMutableArray array];
或者在代码中:
-(NSArray*)returnAnArray
{
NSMutableArray* editableArray = [NSMutableArray array];
[editableArray addObject:[[NSObject alloc] init]]; //an exemplary object added to the array
return editableArray;
}
然而,这就是说,在某些特定情况下,转换NSMutableArray
为NSArray
可能不安全,例如,如果原始数组存储在实例变量中。如果同时枚举返回的数组,则在该数组中添加或删除对象可能会导致崩溃。例如:
-(void)createArray
{
self->editableArray = [NSMutableArray array]; // instance variable: NSMutableArray* editableArray
}
-(void)addObjectToArray
{
[self->editableArray addObject:[[NSObject alloc] init]];
}
-(NSArray*)getArray
{
return self->editableArray;
}
-(void)enumerateArray
{
for(NSObject obj in [self getArray])
{
// do something with obj
}
}
如果与(例如从后台线程)addObjectToArray
同时调用,enumerateArray
则应用程序将崩溃,因为在枚举时底层数组正在更改。它以 . 的形式返回并不重要NSArray*
。在这种情况下,您需要添加以同步多个线程对同一对象的访问,或者按照建议@synchronized
复制整个数组。arrayWithArray:
但是请注意,文档并没有说明是否arrayWithArray:
是线程安全的,所以无论如何我都会@synchronized
在调用周围添加arrayWithArray:
。