删除数据时执行_BAD-ACCESS

时间:2013-03-16 07:59:45

标签: ios objective-c core-data nsmanagedobject

我使用NSFetchedResultsController在表格视图中显示数据。现在,当数据从服务器到达时,我需要删除sqlite数据库中的所有数据。

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

  

Execution_BAD-ACCESS(code = 2,address = 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 个答案:

答案 0 :(得分: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...
}

答案 1 :(得分:0)

flexaddicted的答案非常好(遗憾的是我还不能发表评论)但是如果你有一个多线程应用程序(在你的问题中提到服务器调用),请记得要非常小心。确保每个线程都使用自己的上下文,否则会遇到问题。这在Apple的核心数据文档中有很好的说明。

或者,至少,确保对核心数据执行任何调用都在主线程上(尽管这不是理想的,因为这可能会在执行长操作时阻塞)。