1

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

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

4

3 回答 3

1

看看NSKeyedArchiver- 你可以归档你的数组数组,取消归档它,你有一个深度复制的克隆。

(当然,这仅在您的所有对象都支持归档时才有效。)

于 2014-02-13T21:23:33.770 回答
0

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

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

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

于 2014-02-13T21:23:28.117 回答
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 创建“类别”。)

于 2014-02-13T21:33:05.580 回答