我想了解苹果文档中的示例,以便深入复制一系列字典这里。
在清单3中,一个真正的深拷贝
这个例子显示
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];请注意,这里没有副本、可变副本或自动发布操作符,因此我很难理解这是如何复制的以及如何发布的。事实上,如果我释放我的实现,它就会崩溃。但是,它确实按预期工作,并且似乎没有任何废弃的内存使用它,如示例所示。
我查看了NSUnarchiver类引用,它提到unarchiveObjectWithData方法创建了对象的临时副本?
这是否意味着适当的实现是分配和插入新数组,而不是仅仅分配指针,以便能够释放它?
提前谢谢。
发布于 2015-12-04 00:13:03
通过对对象图进行完整的归档传递,他们正在进行深度复制。使用NSArchiver可以实现诸如自动循环引用管理之类的功能,对象可以选择不对它们的委托之类的东西进行编码,或者可以将内容挂回非归档文件。
对于所有的意图和目的,它是存档的,保存到磁盘,然后将它作为一个新的文档读入。只是,它不是磁盘,而是一直存储在内存中。
它是缓慢的,非常昂贵的,而且完全不适合任何东西,但是当您非常偶然地使用时,需要完全复制一个复杂的对象图。
unarchiveObjectWithData:返回一个自动释放的对象.如果您使用MRC,您需要保留它,如果您想保留它。但是,更好的解决办法是搬到ARC。
发布于 2015-12-04 01:13:36
因为你不遵守苹果声明的内存管理规则,所以你在保留(或之后不久)崩溃,这些规则可以在这里找到:https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html
您是否从包含alloc、new、copy或deepCopy的方法中获取对象的名称?不,那么释放它不是你的责任。
你想抓住这个东西吗?如果是的话,你有责任保留它。
至于为什么这个代码片段会导致一个深拷贝,您应该再读一遍归档类所做的事情。它们不处理对象,而是处理“对象内容的描述”。您也可以轻松地完成"json导出结果的json导入“或"xml导出的xml导入”。
https://stackoverflow.com/questions/34078545
复制相似问题