NSManagedObject的副本

时间:2013-12-03 15:12:20

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

当我将copy消息发送到NSManagedObject子类时,我收到此错误:

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

为什么我不应该复制NSManagedObjects

1 个答案:

答案 0 :(得分:1)

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

考虑具有两个子对象的父对象和父对象所在的城市对象的情况。如果我复制父对象,我是否还应该复制子对象?可能是的,因为你不希望同一个孩子拥有多套父母。我应该复制这个城市吗?可能不会,因为每个人都没有得到自己的芝加哥副本。你应该在那里建立一个新的链接。您只能知道这一点,因为您知道对象代表什么。只有程序员才能实现这种逻辑。

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

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