我正在使用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的新创建对象,否则将产生问题。
最佳答案
根据您的评论
我正在使用操作队列。所以我在主线程上输入数据。 2.你是
说每个线程应该有单独的上下文实例。但
我认为应该只有上下文的一个主要实例。
否。您必须遵循有关Concurrency with Core Data的文档
为每个线程创建一个单独的托管对象上下文,并共享一个
单一持久性存储协调器。这是通常推荐的
方法。
要么
创建一个单独的托管对象上下文和持久性存储
每个线程的协调器。这种方法提供了更大的
并发以更大的复杂性为代价(尤其是如果您
需要在不同环境之间传达变化)
内存使用情况。
要么
使用新的Core Data API。
原始问题
如果您提供有关崩溃的其他详细信息,我想我们可以为您提供帮助。那delegate
呢?
同时,一些提示给您。
1)在Xcode中启用僵尸
How to enable NSZombie in Xcode?
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...
}
关于ios - 删除数据时为Execution_BAD-ACCESS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15446993/