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

时间:2011-08-10 08:07:50

标签: iphone objective-c xcode core-data 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);
        }

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

5 个答案:

答案 0 :(得分:7)

查看此answer表明CoreData内部使用异常来管理其程序流。这就是调试器在objc_exception_throw中断的原因。据我所知,没有办法禁用它。

编辑:从那时起,现在有一个解决方案可以忽略这些例外:Ignore certain exceptions when using Xcode's All Exceptions breakpoint

顺便说一句:请勿查看error,但请使用返回的BOOL值来确保您的保存通话成功。这样做的正确方法是:

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

答案 1 :(得分:4)

  • 首先,当使用CoreData的多线程时,我遇到的问题很少 在应用程序周围传递NSManagedObject。相反,正如记录所述 Apple,我最终传递NSManagedObjectID并重新完成 对象。
  • 其次,当您没有记录任何内容时,可能与之相关 内存问题,特别是尝试运行探查器,但不仅仅是,寻找'Zombie',它 应该告诉你更多。
  • 最后,请确保您已正确初始化上下文,我有 类似的问题,因为没有找到来自momd文件的模型 没装。

答案 2 :(得分:1)

我遇到了类似的问题,最终结果是由于 NSManagedObjectContextDidSaveNotification 的观察者已被解除分配而未从通知中心移除。似乎CoreData异常“隐藏”了当通知中心尝试通知任何对象占用已注册(但已解除分配)的观察者释放的内存时引发的未知选择器异常。

答案 3 :(得分:0)

我碰巧遇到了这个问题,经过很长时间的调试我发现它是因为NSError *错误的重复声明,你可能在外部作用域中有另一个NSError *错误,如:

NSError* error = nil;

一些代码

if (!error)
{
    NSError* error = nil;
    // your code
}

然后错误将为零,尽管事实上存在例外。

答案 4 :(得分:0)

最近我遇到了同样的问题:在尝试保存managedObjectContext时,app没有任何日志崩溃。

就我而言,上面提到的原因完全不同:
确保您的Mac上没有打开DB Manager,这可能会锁定持久数据存储。

这(显然)也会杀死Core Date堆栈,而不会在代码或日志中抛出任何可见的错误。

原来我有一些未保存的更改,这使得DB Manager锁定了商店。关闭数据库管理器修复了该问题。简单而愚蠢的错误,但花了我几个小时才弄明白。