0

我正在使用NSFetchedResultsController. 现在,当数据从服务器到达时,我需要删除 sqlite 数据库中存在的所有数据。

现在,当我使用下面给出的代码从数据库中删除数据时,它有时会崩溃(并非总是如此)并给出此错误:

Execution_BAD-ACCESS(代码=2,地址=0x0)

在这条线上

if (![moc save:&saveError]) {

。H

@property (readonly, retain, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, retain, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, retain, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

.m

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

NSManagedObjectContext *moc = [delegate managedObjectContext];

NSFetchRequest * allCategories = [[NSFetchRequest alloc] init];
[allCategories setEntity:[NSEntityDescription entityForName:@"Categories" inManagedObjectContext:moc]];
[allCategories setIncludesPropertyValues:NO]; //only fetch the managedObjectID

NSError * error = nil;
NSArray * dataArray = [moc executeFetchRequest:allCategories error:&error];

//error handling goes here

[NSFetchedResultsController deleteCacheWithName:@"RootDetail"];

for (Categories *cat in dataArray) {
    [moc deleteObject:cat];
}

NSError *saveError = nil;      
if (![moc save:&saveError]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

[allCategories release];

我现在彻底检查,我发现当我访问 DetailPageController 并返回(使用 UINavigationController popNavigationController :) 时,这个问题就来了,然后如果我想要 DetailPageController,它就会崩溃。

给出以下错误 -[DetailPageController controllerWillChangeContent:]:消息发送到已释放实例 0x11f52a90 *


问题在于 NSManageObjectContext。所以修复总是使用新创建的 NSManageObjectContext 对象,否则会产生问题。


4

2 回答 2

2

根据您的评论

我正在使用操作队列。所以我在主线程上输入数据。2.你是说每个线程应该有单独的上下文实例。但我认为应该只有一个主要的上下文实例。

没有。您必须遵循有关Concurrency with Core Data的文档

为每个线程创建一个单独的托管对象上下文并共享一个持久存储协调器。这是通常推荐的方法。

或者

为每个线程创建一个单独的托管对象上下文和持久存储协调器。这种方法以更大的复杂性(特别是如果您需要在不同的上下文之间传达更改)和增加的内存使用量为代价提供更大的并发性。

或者

使用新的核心数据 API。

原始问题

如果您提供有关崩溃的其他详细信息,我想我们可以为您提供帮助。怎么样delegate

同时,给你一些提示。

1) 在 Xcode 中启用僵尸

如何在 Xcode 中启用 NSZombie?

2)使用正确的上下文

为什么要使用以下内容?

NSManagedObjectContext *moc = [delegate managedObjectContext];

只需使用

NSManagedObjectContext *moc = [self managedObjectContext];

这可能是问题的根源。但没有细节我不太确定。

因此,当您从外部创建此控制器时,请正确设置托管对象上下文属性。

yourController.managedObjectContext = theContextYouWantToShare;

3) 错误处理

NSError * error = nil;
NSArray * dataArray = [moc executeFetchRequest:allCategories error:&error];
if(dataArray) {
    // manage objects here...
} else {
    // handle error here...
}
于 2013-03-16T14:46:39.683 回答
0

The answer by flexaddicted is very good (unfortunately I can't comment yet) but remember to be very careful if you have a multi-threaded application (you mention server calls in your question). Make sure that each thread uses its own context, otherwise you will run into problems. This is well docmented in Apple's Core Data documentation.

Or, at the very least, make sure that any call to do something with core data is on the main thread (although this is not ideal as this can block when performing long operations).

于 2013-03-16T15:59:54.703 回答