ios - Execution_BAD-ACCESS 删除数据时

标签 ios objective-c core-data nsmanagedobject

我使用 NSFetchedResultsController 在 TableView 中显示数据。现在,当数据从服务器到达时,我需要删除 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:) 时会出现这个问题,然后如果我 wist DetailPageController 然后它崩溃。

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


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


最佳答案

根据您的评论

I am using operation queue. so i enter data on main thread. 2. you are saying that each thread should have separated instance of context. But i think there should be only one main instance of context.

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

Create a separate managed object context for each thread and share a single persistent store coordinator. This is the typically-recommended approach.

Create a separate managed object context and persistent store coordinator for each thread. This approach provides for greater concurrency at the expense of greater complexity (particularly if you need to communicate changes between different contexts) and increased memory usage.

使用新的核心数据 API。

原始问题

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

同时,给你一些提示。

1) 在 Xcode 中启用僵尸

How to enable NSZombie in Xcode?

2) 使用正确的上下文

为什么要使用以下内容?

NSManagedObjectContext *moc = [delegate managedObjectContext];

就用

NSManagedObjectContext *moc = [self managedObjectContext];

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

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

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/

相关文章:

iphone - UIManagedDocuments 什么时候关闭?

ios - 了解 iOS 应用程序是否已从 Flash 转换

ios - 使用字典作为模型

ios - 如何将 NSArray(字符串格式)转换为真正的数组格式?

ios - 如何将可映射对象保存到 nsuserdefault?

ios - UIWebView 并保持事件状态?

ios - 将事件的 RecurrenceRule 保存到 CoreData

swift - 我应该使用 NSUserDefault 还是 CoreData 来保存最后十个分数?

iphone - 将 html 文本添加到我的 UIWebView

ios - 代码=134110 - 强制目标属性上缺少属性值的验证错误