Coredata,EXC_BAD_ACCESS或相关对象的奇怪行为

时间:2011-03-23 11:49:35

标签: cocoa core-data memory-management

我有一个Journal NSManagedObject子类,它有很多页面。 我已创建此自定义方法(在类别中)以按顺序获取页面数组。 如你所见,这很简单。

//
// @returns an array of pages sorted by indexInJournal
//
- (NSArray*)sortedPages {
    NSLog(@"Are we in main thread? %i", [NSThread isMainThread]);
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"indexInJournal"
                                                               ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    NSArray *result = [[self.pages allObjects] sortedArrayUsingDescriptors:sortDescriptors];
    return result;
}

由于某种原因,该方法有时失败,我在self对象上得到EXC_BAD_ACCESS;这很奇怪,因为我正在执行它的方法。 NSZombieEnabled没有帮助。

当从其他例程调用时,该方法可以工作,但只返回一个页面(第一个);我相信有3页。

在coredata istantiates / release objects的路上有什么我遗漏的东西吗?

干杯, 的Davide

2 个答案:

答案 0 :(得分:0)

您需要确保您与Journal对象的managedObjectContext位于同一个线程上,或者Journal对象可能无法在关系中找到Pages个对象。

交叉线程会导致各种问题。在获得想象之前,验证方法是否在单个线程上工作。

答案 1 :(得分:0)

我发现了问题所在。 基本上,在创建页面时,我将它们添加到日志页面集并释放它们;因此我了解到你没有发布NSManagedObject。 这就是生成EXC_BAD_ACCESS的原因。检测起来有点棘手,因为页面会在必要时自动创建,所以我不知道我是在添加它们。