2014-02-13 65 views
1

我已经创建了一个模型,主要具有用于拆分视图(两个UITableViews)“待办事项”列表类型应用程序的自定义对象的嵌套数组。左边(主)是列表的列表,右边(详细)是列表:)其他一些变量保存在一些类中,如isSelected,isExpanded ...尝试修改nscopied对象的属性时出现错误

所有这些类都实现NSCopying协议。当我制作主列表项目的副本并更改副本的名称时,但如果更改属于该主列表项目的详细列表项目中的任何内容,则副本和原始副本都会更改。所以我想我的问题是如何创建一个主列表项的深层副本。我想通过使他们都实现NSCopying协议它会自动做到这一点。我真的不知道如何处理代码,只需要问什么。

+0

您必须实现“深层复制”。相当简单,因为递归将处理大部分内容 - 只需实现一个'deepCopy'方法,该方法遍历所有直接从正被复制的对象中寻址的对象,并在每个对象上执行'deepCopy',将结果放入副本你正在创造。 –

回答

1

看看NSKeyedArchiver - 您可以将您的阵列存档存档,将其解压缩,并且您拥有深度复制的克隆。

(当然这仅适用于如果所有的对象都支持归档。)

0

如何创建一个主列表项

的深层副本通过在自己的代码实现深拷贝逻辑。深拷贝通常 - 有时,但通常不是 - 只是为集合中的每个对象及其所连接的所有对象进行拷贝。无论如何,属性列表的外部支持深度副本,但仅限于非常简单的非循环对象图。

因此,您需要迭代集合并复制集合中的每个项目。虽然实施copyWithZone:看似合理,但通常通过手动实例化新实例并根据需要设置基于原始的各种属性来完成深层副本,并在需要时进行复制。

0
-(MyClass)deepCopy { 
    MyClass* theCopy = [self mutableCopy]; 
    for (MyElementType* element in self.dataContainer) { 
     MyElementType* theCopiedElement = [element deepCopy]; 
     [theCopy somehowInsertThisElementInTheRightPlace:theCopiedElement]l 
    } 
    return theCopy; 
} 

显然,有一点参与在5日线魔法 - 你究竟是如何做到这一点取决于如何子公司数据项目附加到您的对象。但实际上只有3-4个基本情景。递归自然处理其他所有事情。

(请注意,你可以“聪明”,而不是复制不可变对象等)

(另请注意,您可以NSMutableArray中和的NSMutableDictionary打造“类别”。)

相关问题