Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSManagedObject的副本_Objective C_Cocoa Touch_Cocoa_Core Data_Nsmanagedobject - Fatal编程技术网

Objective c NSManagedObject的副本

Objective c NSManagedObject的副本,objective-c,cocoa-touch,cocoa,core-data,nsmanagedobject,Objective C,Cocoa Touch,Cocoa,Core Data,Nsmanagedobject,当我将copy消息发送到NSManagedObject子类时,我收到以下错误: “NSInvalidArgumentException”,原因:“-[JTPModel copyWithZone::]:发送到实例0x8d19a10的选择器无法识别” 为什么我不应该复制NSManagedObjects?@aleroot的链接很好。至于为什么这样做的基本问题,问题在于对于如何进行复制,没有一个单一的答案。您必须决定如何复制对象。这适用于所有面向对象语言中的所有对象,而不仅仅是NSManagedObje

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

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


为什么我不应该复制
NSManagedObjects

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

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

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


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

通常,要制作副本,您需要创建一个新的nsmanagedobject,并从原始文件复制属性。这样就有了两个具有相同属性的对象,但它们是两个不同的对象。你可以通过获取他们的objectID来检查,他们会有所不同。正如你所说的,你描述的“问题”适用于所有对象的所有副本。那么:为什么可以为其他类的对象而不是托管对象解决这些问题呢?您没有给出具体的原因,为什么可以解决Cocoa中很多很多类的深度“问题”,但不能解决托管对象的深度问题。NSCopyObject()的问题不是决定复制什么,不是决定如何复制,而是内存管理。这不是托管对象的特定问题。对于其他泛型类,不可能解决该问题
NSObject
不符合
,就像
NSManagedObject
不符合一样。对于托管对象,这里没有特殊情况。它们与其他对象有完全相同的问题。在NSObject中实现是不可能的,因为它不知道复制什么以及如何复制。托管对象在形式上定义良好。可以从可用的模型定义中读取所需的信息。情况不一样。例如,泛型副本可以复制所有属性,使子类的代码更短。(NSObject的通用副本无法做出决定。)