我有三个班,A,B和C. A是主要班级。
当用户想要查看所购买的所有对象的列表时,将从A调用B类并显示核心数据实体中的对象列表。
在B类中,用户可以购买新对象(应用内购买)。当用户想要购买另一个对象时,会调用C类。
调用C类时,使用
在核心数据实体上创建一个新对象anObject = [NSEntityDescription insertNewObjectForEntityForName:@"Objects" inManagedObjectContext:context];
然后使用
之类的东西将此对象分配给C类的本地引用self.object = anObject;
此对象变量声明如下:
.h
MyObjects *object;
@property (nonatomic, retain) MyObjects *object;
and @synthesized on .m
MyObjects是表示实体的核心数据类。
理论上,对象将保留分配给它的任何内容,因此我先前输入的 self.object = anObject 行将在self.object上保留一个对象引用,对吗?
问题是当我在购买新对象后尝试访问同一类中的self.object时,我收到错误“CoreData无法解决XXX的错误”,其中XXX完全是self.object。
代码中没有任何对象从数据库中删除。我可以识别的唯一对数据库的操作是在崩溃之前由另一个类完成的保存操作。保存由
之类的东西完成if (![self.managedObjectContext save:&error]) ...
有什么关系吗?可能是什么造成的?
答案 0 :(得分:3)
CoreData管理托管对象的生命周期,您不应保留和释放它们。如果要保留对对象的引用以便以后可以检索,则必须存储对象的id(使用 - [NSManagedObject objectID]获取)。然后使用它来使用 - [NSManagedObjectContext objectWithID:]检索对象。
确保您了解CoreData故障。阅读documentation。
答案 1 :(得分:2)
我几天前遇到过类似的问题(使用NSFetchedResultsController),我将fetchedObjects放入一个数组中,并收集属性以从数组对象中填充表格。似乎如果数组中的对象出现故障,除非您对直接对象执行操作,否则无法将其解除。就我而言,我通过采用有问题的代码并调用[[_fetchedResultsController objectAtIndexPath:indexPath] someAttribute]
来解决问题。我会假设做类似的事情也会解决你的问题。需要从managedObjectContext获取以获取故障值似乎有点乏味,但这是我个人能够解决问题的唯一方法。
答案 2 :(得分:1)
Core Data负责管理内存中托管对象的生命周期。理解托管对象上下文非常重要 - 阅读documentation。
Apple还提供了整个问题排查部分here,其中包含导致错误的原因。但是,只有了解核心数据的工作原理,它才真正有用。
答案 3 :(得分:0)
最可能的错误是您保存的对象不属于托管对象上下文。
假设您在不同的线程上使用相同的对象,并且这些不同的线程使用不同的托管对象上下文,则会发生这种情况。