2013-03-16 149 views
0

我使用NSFetchedResultsController表示表视图数据时Execution_BAD-ACCESS。现在,当数据从服务器到达时,我需要删除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]; 

我检查throughly现在我发现,当我访问次数的DetailPageController并返回(使用UINavigationController的popNavigationController :),然后如果我WIST DetailPageController那么它崩溃这个问题来了。

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


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


+0

执行不良访问通常意味着对象已被提前释放。您的应用程序委托中定义的moc属性如何? – occulus 2013-03-16 09:09:55

+0

现在请检查 – 2013-03-16 09:35:58

+0

有点晚了,但加入我的2cents。确保在uiviewcontroller的dealloc方法中将提取结果控制器的委托设置为nil。 – user281300 2014-12-23 13:59:07

回答

2

基于您的评论

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.

没有。您MUST按照文档中关于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]; 

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

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

yourController.managedObjectContext = theContextYouWantToShare; 

3)错误处理

NSError * error = nil; 
NSArray * dataArray = [moc executeFetchRequest:allCategories error:&error]; 
if(dataArray) { 
    // manage objects here... 
} else { 
    // handle error here... 
} 
+0

在应用程序中将只有一个NSManageObjectContext实例。所以如果我从代理或SetIt在视图控制器初始化时它会产生任何问题。 – 2013-03-18 07:14:57

+0

当我启用NSZombie然后错误是现在,应用程序将不会加载仪表板,并在第一次没有第二次访问屏幕时崩溃。 *** - [DetailPageController controllerWillChangeContent:]:发送到释放实例的消息0x11f52a90 – 2013-03-19 06:47:59

+0

我在激活NSZombie后解决了问题。谢谢 – 2013-03-19 07:00:36

0

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

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

+0

1.我正在使用操作队列。所以我在主线上输入数据。 2.你在说每个线程应该有独立的上下文实例。但我认为应该只有一个主要背景实例。 – 2013-03-18 07:17:12

+0

要测试运行核心数据操作的线程,可以在调用核心数据操作时添加[NSThread isMainThread]。 Apple的文档有更多信息:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html。在这个链接中,它确实表示'推荐用于与Core Data并发编程的模式是线程限制:每个线程都必须拥有完全私有的受管对象上下文。但是,我不知道这是否是问题。尝试检查你正在调用coredata操作的线程并尝试来自flexaddicted的建议。 – miwic 2013-03-18 12:22:28