尝试修改nscopied对象的属性时出错

时间:2014-02-13 21:13:16

标签: objective-c ios5 nskeyedarchiver nscopying

我创建了一个模型,主要是一个嵌套的自定义对象数组,用于拆分视图(两个UITableViews)“待办事项”列表类型应用程序。左(主)是列表,右(详细)是列表:)一些其他变量保存在一些类中,如isSelected,isExpanded ...

所有这些类都实现了NSCopying协议。当我复制主列表项并更改有效的副本名称时,但如果我更改属于该主列表项的详细列表项中的任何内容,则它会同时更改副本和原始项。所以我想我的问题是如何创建主列表项的深层副本。我想通过让它们全部实现NSCopying协议,它会自动执行此操作。我真的不知道要为代码添加什么,所以你只需要问一下。

3 个答案:

答案 0 :(得分:1)

查看NSKeyedArchiver - 您可以归档阵列数组,取消归档,并且您有一个深度复制的克隆。

(当然,这只适用于所有对象都支持存档的情况。)

答案 1 :(得分:0)

  

如何创建主列表项的深层副本

通过在您自己的代码中实现深层复制逻辑。深层副本通常 - 有时,但通常不是 - 不仅仅是复制集合中的每个对象及其连接的所有内容。无论如何,在属性列表之外,它们支持深层复制,但仅限于非常简单的非循环对象图。

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

答案 2 :(得分: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创建"类别")