NSManagedObjectContext保存不会崩溃,但会在objc_exception_throw上中断

Ami*_*neG 6 iphone xcode core-data objective-c nsmanagedobjectcontext

我遇到了与此地址相同的问题http://www.cocoabuilder.com/archive/cocoa/288659-iphone-nsmanagedobjectcontext-save-doesn-crash-but-breaks-on-objc-exception-throw.html

我正在调试一个使用多线程核心数据的应用程序,我在objc_exception_throw上有一个断点,它在保存调用中遇到了这个断点.(代码中的第2行)

        NSError *error = nil;
        [self.managedObjectContext save:&error];
        if (error) {
            NSLog(@"Error : %@",error);
        }
Run Code Online (Sandbox Code Playgroud)

我没有任何记录的东西.我正在使用Xcode 4和ios 4.0 - > 4.3.我认为这与Xcode/iOS版本无关.

Pat*_*rik 7

查看此答案可以发现CoreData内部使用异常来管理其程序流.这就是调试器在objc_exception_throw中断的原因.据我所知,没有办法禁用它.

编辑:从那时起,现在有一个忽略这些异常的解决方案:在使用Xcode的All Exceptions断点时忽略某些异常

顺便说一句:不要检查,error但使用返回的BOOL值来确保您的保存呼叫成功.这样做的正确方法是:

NSError *error = nil;
BOOL success = [self.managedObjectContext save:&error];
if (!success) {
    NSLog(@"Error : %@",error);
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*rdo 5

  • 首先,当在 CoreData 中使用多线程时,我在应用程序周围传递 NSManagedObject 时几乎没有问题。相反,正如 Apple 所记录的那样,我最终传递了 NSManagedObjectID 并重建了完整的对象。
  • 其次,当您没有记录任何内容时,这可能与内存问题有关,请特别尝试运行分析器,但不仅如此,寻找“僵尸”,它还会告诉您更多信息。
  • 最后,确保您已正确初始化上下文,我遇到了类似的问题,因为未找到且未加载来自 momd 文件的模型。