2010-12-10 94 views
1

我有一些核心数据对象在某种程度上是无效的问题。 托管对象上下文位于应用程序委托中,我在视图表中使用它从数据库中提取“笔记”对象并显示它们。 我建立区段(今天,昨天等)的阵列,并且对于每个部分中这样的部分与笔记的数组:核心数据对象被无效

// 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已失效。

这发生在数组中的所有对象。

这怎么可能?我检查并且不重置/释放上下文。或者是否存储核心数据对象并在稍后再引用它?

编辑:这似乎也发生,如果我不滚动,并希望显示关于一个笔记的细节,当它被选中。似乎只要显示第一个音符,它们就会失效。

+0

您是否需要保留managedObjectContext或者是否在应用程序内部执行deleagate - 如果您的托管对象上下文消失,可能会导致此错误。 – deanWombourne 2010-12-10 12:31:36

+0

在应用程序委托中,我有由Xcode自动创建的属性:@property(nonatomic,retain,readonly)NSManagedObjectContext * managedObjectContext;所以应该保留。我不会在任何地方发布它,而且我也不会更改数据库。 – 2010-12-10 12:42:44

回答

1

它似乎与管理笔记对象的方式有关,但执行此操作的代码不在您的示例中。 notes数组是一个autorelease数组,所以除非你保留它的某个地方,它可能会在你加载下一节之前释放。

+0

A“音符”被添加到“部分的”阵列,以及“部分”数组”被添加到‘数据’阵列(其被保留)...的说明不应该被保留,然后? – 2010-12-10 12:54:36

+0

抱歉。错过了:-) – drekka 2010-12-10 13:01:22

+0

这段代码何时执行? – drekka 2010-12-10 13:02:34