objective-c - NSManagedObject 的副本

标签 objective-c cocoa-touch cocoa core-data nsmanagedobject

当我将 copy 消息发送到 NSManagedObject 子类时,出现以下错误:

'NSInvalidArgumentException',原因:'-[JTPModel copyWithZone:]:无法识别的选择器发送到实例 0x8d19a10'

为什么我不应该复制 NSManagedObjects

最佳答案

@aleroot 的链接很好。对于“为什么”这个基本问题,问题在于对于如何执行复制没有单一的答案。您必须决定如何复制对象。所有面向对象语言中的所有对象都是如此,而不仅仅是 NSManagedObject .

考虑一个父对象有两个子对象和一个父对象所在的城市对象的情况。如果我复制父对象,是否也应该复制子对象?可能是的,因为您不希望同一个 child 有多对 parent 。我应该复制城市吗?可能不会,因为每个人都没有一份属于自己的《芝加哥》。您应该在那里建立一个新链接。你只能知道这一点,因为你知道这些对象代表什么。只有程序员才能实现这个逻辑。

一些面向对象的语言为所有对象提供了一个简单的“浅”复制解决方案(这在上述情况下是不合适的)。 ObjC 为集合对象提供此功能,但不为通用对象提供此功能。相反,您需要通过遵守<NSCopying>来实现策略。协议(protocol)。

只是一段历史:对带注释的“属性”的语言支持在 ObjC 中是相当新的。几年前,对象知道它们的 ivar,但运行时没有关于它们的语义的有用信息(例如它们是副本、强引用还是弱引用)。这使得对象的自动复制变得非常困难,即使在简单的情况下也是如此。有一个自动浅复制函数称为 NSCopyObject() ,但它非常容易出错并且caused much more trouble than it solved 。幸运的是,它最终在 iOS 6 和 OS X 10.8 中被弃用。

关于objective-c - NSManagedObject 的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20354773/

相关文章:

macos - 无法在 MacOS Web View 屏幕截图中获取所有内容

objective-c - 此类对于键 PerformRotate 不符合键值编码

ios - 包含文件内容的字典在 ios 中不起作用

ios - 为什么 NSMutableSet 不删除其中包含的对象?

iphone - 是否可以制作三角形 UIView?

iphone - 了解我在 iPhone 上使用哪种互联网连接类型的方法

objective-c - 关于包装盒内容

javascript - Cocoa webview和透明窗口的烦恼

objective-c - 界面生成器和预处理器

ios - 保留 UITableViewCell 选择状态