Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c mutableCopy是否使包含的对象可变?_Objective C_Cocoa_Nsmutablearray - Fatal编程技术网

Objective c mutableCopy是否使包含的对象可变?

Objective c mutableCopy是否使包含的对象可变?,objective-c,cocoa,nsmutablearray,Objective C,Cocoa,Nsmutablearray,myArray是NSDictionary对象的NSArray。[myArray mutableCopy]是否包含原始NSDictionary对象或NSMutableDictionary副本?有没有一种简单的方法可以使不可变的对象图完全可变?Cocoa中的副本通常很浅。这意味着它只影响最顶端的对象,在本例中是数组。您将得到一个可变的不可变字典数组。没有一种方法可以像你所要求的那样使整个事情变为可变的。唯一的方法是迭代原始数组,创建每个对象的可变副本,并用可变数组中的可变对象替换可变数组中的不可变对

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时,这不起作用