Objective c mutableCopy是否使包含的对象可变?
myArray是NSDictionary对象的NSArray。[myArray mutableCopy]是否包含原始NSDictionary对象或NSMutableDictionary副本?有没有一种简单的方法可以使不可变的对象图完全可变?Cocoa中的副本通常很浅。这意味着它只影响最顶端的对象,在本例中是数组。您将得到一个可变的不可变字典数组。没有一种方法可以像你所要求的那样使整个事情变为可变的。唯一的方法是迭代原始数组,创建每个对象的可变副本,并用可变数组中的可变对象替换可变数组中的不可变对象。哇,这个词已经失去了所有的意义Objective c mutableCopy是否使包含的对象可变?,objective-c,cocoa,nsmutablearray,Objective C,Cocoa,Nsmutablearray,myArray是NSDictionary对象的NSArray。[myArray mutableCopy]是否包含原始NSDictionary对象或NSMutableDictionary副本?有没有一种简单的方法可以使不可变的对象图完全可变?Cocoa中的副本通常很浅。这意味着它只影响最顶端的对象,在本例中是数组。您将得到一个可变的不可变字典数组。没有一种方法可以像你所要求的那样使整个事情变为可变的。唯一的方法是迭代原始数组,创建每个对象的可变副本,并用可变数组中的可变对象替换可变数组中的不可变对
NSArray *mutableArray = [originalArray mutableCopy];
for (NSDictionary *dictionary in originalArray)
{
NSInteger index = [originalArray indexOfObject:dictionary];
NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];
[mutableArray replaceObjectAtIndex:index withObject:mutableDictionary];
}
应该清楚的是,您可以使用嵌套for循环进一步深入到图形中。根据阵列的大小,您可能需要一个自动释放池来检查内存。如果您不介意大型对象图所需的时间,并且您确实需要对象的深度副本,则可以序列化对象图,然后反序列化它。要做到这一点最简单的方法(假设所有对象都是基础集合对象)就是使用类。将根对象序列化为数据,然后使用
NSPropertyListMutableContainersAndLeaves
选项反序列化为可变根级数组。生成的根级别可变数组将是一个深度副本,所有容器都是可变的。重要的是要记住,这实际上是一个深度副本,因此如果您在另一个容器中更改了某些内容,那么这些更改将不会反映在原始对象中
下面是一个快速代码示例:
// Assumes the root-level object is an array, adjust as necessary
- (NSMutableArray*)deepMutableCopyOfArray:(NSArray*)array error:(NSError**)outError
{
NSError* error = nil;
NSData* serializedData = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error];
if( !serializedData ) {
if( outError ) *outError = error;
return nil;
}
NSMutableArray* mutableCopy = [[NSPropertyListSerialization propertyListWithData:serializedData options:NSPropertyListMutableContainersAndLeaves format:NULL error:&error] retain];
if( !mutableCopy ) {
if( outError ) *outError = error;
return nil;
}
return mutableCopy;
}
我认为如果你使用块迭代器,它会更有效,因为你会被传递索引,而不必为每个对象查找它。哦,耶!基于块的枚举。现在可在您附近的iOS 4+设备上使用!不幸的是,当输入数组包含NSNull时,这不起作用