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".
我想了解 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".