可可深拷贝容器

时间:2015-12-03 23:55:26

标签: objective-c cocoa nsarray nsdictionary deep-copy

我想要了解苹果文档中深度复制字典数组Here的示例。

清单3中的真正深层复制

示例显示

NSArray* trueDeepCopyArray = [NSKeyedUnarchiver  unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

请注意,没有副本,可变副本或自动释放操作符,因此我很难理解这是一个副本以及它是如何发布的。事实上,如果我发布我的实现,它将崩溃。然而它确实按预期工作,并且似乎没有任何废弃的内存使用它,如示例所示。

我查看了NSUnarchiver类引用,它提到unarchiveObjectWithData方法创建了一个对象的临时副本?

这是否意味着正确的实现是分配和初始化新数组而不仅仅是分配指针以便它可以被释放?

提前致谢。

2 个答案:

答案 0 :(得分:1)

他们通过在对象图上执行完整的归档传递来进行深层复制。使用NSArchiver可以实现自动循环引用管理等功能,并且对象可以选择不对代理进行编码,也可以将它们挂钩到unarchival上。

对于所有意图和目的,通过将某些内容保存到磁盘然后将其作为新文档重新读取来存档。只是,而不是磁盘,它只是一直存储在内存中。

它很慢,非常昂贵,并且完全不适合任何事情,但当你非常偶尔需要完全复制复杂的对象图时。

unarchiveObjectWithData:返回一个自动释放的对象。如果您使用MRC,则需要保留它,如果您想保留它。但是,更好的解决方案是转向ARC。

答案 1 :(得分:0)

您在保留时(或之后不久)崩溃,因为您不遵守Apple规定的内存管理规则,可在此处找到:https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

您是否从名称中包含alloc,new,copy或deepCopy的方法获取对象?不,那么释放它不是你的责任。

你想坚持这个对象吗?如果是这样,您有责任保留它。

至于为什么此代码段会产生深层副本,您应该再次阅读归档类的功能。他们不处理您的对象,他们处理对象内容的描述"。您可能很容易对json导出结果进行" json导入"或者xml导出的" xml导入"。