我甚至不确定我是否说明了这一点,但我正在尝试复制用户创建的coredata对象intstance,并且很难搞清楚它。
我有一个从managedObjectContext
拉入的对象(问题)。
这来自我的数据库中有很多问题的测验。
我的内存中有一个名为question1的Question实例。我想将question1复制到一个名为question2的实例。
Question *question2 = question1;
有时工作但有时也崩溃(我知道这不是正确的方法)
我一直在搞乱NSCopying和-(id)copyWithZone:(NSZone *)
区域,但我只是得到一个空白的实例。
如果有人能提供帮助,那将非常感谢!
这里有一些细节。
我有问题1它是问题的一个实例。例如,question1.answer将返回问题的答案。
我想简单地将问题1复制到问题2。我不需要在数据模型中存储question2或者我只需要在循环中使用它然后释放。
基本上我想这样做:
Question *question2 = question1;
NSLog(@"%@", question2.answer)
以上是有时工作但有时我在nslog行上遇到随机崩溃。
答案 0 :(得分:6)
您必须在托管对象上下文中创建一个新对象,然后复制所有属性和关系:
Question *question2 = [NSEntityDescription
insertNewObjectForEntityForName:@"Question"
inManagedObjectContext:context];
// Copy attributes:
question2.attr1 = question1.attr1;
question2.attr2 = question1.attr2;
// ...
// Copy relationships:
question2.rel1 = question1.rel1;
// ...
这可以使用NSEntityDescription
的{{1}}自动处理并处理实体描述中的所有属性和关系,请参阅此问题的(很棒)答案:How can I duplicate, or copy a Core Data Managed Object?。但请注意,该代码也会复制所有相关对象,这可能不是您想要的。
我认为如果没有太多属性/关系,“手动”复制会更容易,如果必须复制,也可以决定每个相关对象。
答案 1 :(得分:1)
马丁的回答是正确的。您只能在托管对象上下文中实例化NSManagedObject子类。
在您的情况下,您说您不想保留复制的对象,您只想使用它。在这种情况下有选项:
Question
类中的字段的副本。为这个带有Question
对象的新类写一个初始化器。然后你可以在你的循环中使用这个新对象,而不用担心它会持久化。