【问题标题】:NSManagedObjectContext save doesn't crash but breaks on objc_exception_throwNSManagedObjectContext 保存不会崩溃,但会在 objc_exception_throw 上中断
【发布时间】:2011-10-23 20:57:54
【问题描述】:

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

我正在调试一个将 Core Data 与多线程一起使用的应用程序,并且我在 objc_exception_throw 上有一个断点,它在调用保存时遇到了这个断点。 (代码中的第 2 行)

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

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

【问题讨论】:

  • 尝试删除断点,看看是否有任何记录。
  • 删除断点时没有记录
  • 尝试将您的条件更改为if(error!=nil)。似乎没有什么不同,但它是......个人经历
  • 是一样的,我也试过 if (![self..managedObjectContext save:&error]) ,没有结果
  • 我可能会弄错,但我知道没有抛出真正的“异常”,通常在使用 xcode 模拟器时,应用程序不会崩溃,但会停止响应,并在控制台中显示“objc_exception_throw”。程序在第 2 行停止,下一行甚至没有被调用。这似乎是一个与记忆有关的问题。

标签: iphone objective-c xcode core-data nsmanagedobjectcontext


【解决方案1】:

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

在我的情况下,原因与上述完全不同:
确保您的 Mac 上没有打开 DB Manager,这可能会锁定持久数据存储。 p>

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

原来我有一些未保存的更改,导致 DB Manager 锁定了存储。关闭 DB Manager 解决了这个问题。简单而愚蠢的错误,但花了我几个小时才弄清楚。

【讨论】:

    【解决方案2】:

    查看此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);
    }
    

    【讨论】:

    • 我的回答已经很久了。现在我通常使用以下测试:if (!success || error) { 并且也有解决异常问题的方法。
    【解决方案3】:

    我碰巧遇到这个问题,经过长时间调试发现是因为重复声明了 NSError* 错误,可能你在外部范围内还有另一个 NSError* 错误,比如:

    NSError* error = nil;
    

    一些代码

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

    那么错误将为零,尽管实际上有一个异常。

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,最终证明是因为 NSManagedObjectContextDidSaveNotification 的观察者在没有从通知中心移除自身的情况下被释放。似乎 CoreData 异常“隐藏”了当通知中心尝试通知任何对象占用已注册(但已解除分配)观察者释放的内存时引发的未知选择器异常。

      【讨论】:

        【解决方案5】:
        • 首先,在将多线程与 CoreData 一起使用时,我遇到了一些问题 在应用程序周围传递 NSManagedObject。相反,正如所记录的 苹果,我最终通过了 NSManagedObjectID 并重建了完整的 对象。
        • 其次,当您没有记录任何内容时,可能与 内存问题,尝试特别运行分析器,但不仅是寻找“僵尸”,它 应该告诉你更多。
        • 最后,确保你已经正确初始化了上下文,我有 类似的问题,因为找不到来自 momd 文件的模型,并且 未加载。

        【讨论】:

        • 想知道您遇到这种情况的原因是什么?我看到了同样的事情。在发生异常时,我得到 警告:尝试使用不在框架中的块创建 USE_BLOCK_IN_FRAME 变量。 奇怪的是它并非一直发生,这似乎指向穿线。因此,您可以发布的任何体验都会很棒!
        • 您可以通过更新通过另一个上下文从持久存储中删除的对象来触发此异常。该异常似乎是通过跳过 dud 对象在内部处理的。
        猜你喜欢
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 2017-12-10
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多