Cocoa 深拷贝容器

Cocoa Deep Copy Containers

我想了解 apple 文档中用于深度复制字典数组的示例 Here

清单 3 中的一个真正的深拷贝

示例显示

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

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

我查看了 NSUnarchiver class 参考,它提到 unarchiveObjectWithData 方法创建对象的临时副本?

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

提前致谢。

他们正在通过对对象图进行完整的归档传递来进行深度复制。使用 NSArchiver 可以实现自动循环引用管理之类的功能,并且对象可以选择不对委托等内容进行编码,或者可以在取消归档时将内容挂钩。

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

它很慢,非常昂贵,而且完全不适合任何事情,除非你偶尔需要完全复制一个复杂的对象图。

unarchiveObjectWithData: returns 一个自动释放的对象。如果你用的是MRC,想留着就得留着。但是,更好的解决方案是迁移到 ARC。

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

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

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

至于为什么这个代码片段会产生深拷贝,你应该再读一遍存档器类是怎么做的。他们不处理你的对象,他们处理 "descriptions of the contents of your objects"。您可能很容易就完成了 "json import of the result of a json export" 或 "xml import of an xml export".