gpt4 book ai didi

ios - Execution_BAD-ACCESS 删除数据时

转载 作者:行者123 更新时间:2023-11-28 22:37:43 26 4
gpt4 key购买 nike

我使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com