核心数据对象无效

Posted

技术标签:

【中文标题】核心数据对象无效【英文标题】:Core Data object gets invalidated 【发布时间】:2010-12-10 11:41:27 【问题描述】:

我对某些以某种方式无效的 Core Data 对象有疑问。 托管对象上下文位于应用程序委托中,我在视图表中使用它从数据库中获取“注释”对象并显示它们。 我为各个部分(今天、昨天等)构建了一个数组,并为每个部分构建了一个包含该部分中的注释的数组,如下所示:

// in the .h file
NSMutableArray* data; // An array containing an array of thoughts for each section.
@property (nonatomic, retain, readonly) NSManagedObjectContext* objectContext;

// in the .m file, when loading the view
ThoughtsAppDelegate* appDelegate = (ThoughtsAppDelegate*)[[UIApplication sharedApplication] delegate];
objectContext = appDelegate.managedObjectContext;

NSEntityDescription* descriptor = [[NSEntityDescription entityForName:@"Note"                       
                                   inManagedObjectContext:objectContext] autorelease];
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:descriptor];
NSError* error;
NSArray* notes = [objectContext executeFetchRequest:request error:&error];
// example for one section
data = [[NSMutableArray alloc] init];
NSMutableArray* ccurrentSection = [[NSMutableArray alloc] init];
[data addObject:currentSection];
for(Note* t in notes) 
    [currentSection addObject:t];

当视图加载时,前 5 个注释会显示(其余的不适合视图),一切正常。但是当我向下滚动查看下一个笔记时,我得到一个

NSObjectInaccessibleException 具有 ID... 的 NSManagedObject 已失效。

数组中的所有对象都会发生这种情况。

这怎么可能?我检查并没有重置/释放上下文。或者存储一个 Core Data 对象并在以后引用它是不是很糟糕?

编辑:如果我不滚动并且想要在选中笔记时显示有关笔记的详细信息,这似乎也会发生。似乎只要显示第一个注释,它们就会失效。

【问题讨论】:

您需要保留 managedObjectContext 还是在您的应用委托中完成 - 如果您的托管对象上下文消失,可能会导致此错误。 在应用程序委托中,我有 Xcode 自动创建的属性:@property (nonatomic, retain, readonly) NSManagedObjectContext* managedObjectContext;所以应该保留。我不会在任何地方发布它,也不会更改数据库。 【参考方案1】:

这似乎与您管理笔记对象的方式有关,但执行此操作的代码不在您的示例中。 notes 数组是一个自动释放数组,因此除非您将其保留在某个地方,否则它可能会在您从中加载下一部分之前释放。

【讨论】:

一个'note'被添加到'section'数组中,'section'数组'被添加到'data'数组中(被保留)......注释不应该是那么保留呢?

以上是关于核心数据对象无效的主要内容,如果未能解决你的问题,请参考以下文章

UITableView - 核心数据应用程序中的表视图崩溃,因为删除后行数无效

如何从数据数组中删除对象(核心数据)

核心数据的 FetchResults 中的谓词无效

核心数据类的无效重新声明

iphone核心数据:无法删除具有一对多关系的数据

核心数据反向关系未设置