Objective c NSManagedObjectContext:异常断点在save:方法处停止,但没有日志/崩溃/错误

Objective c NSManagedObjectContext:异常断点在save:方法处停止,但没有日志/崩溃/错误,objective-c,core-data,Objective C,Core Data,我在一个多线程的iOS应用程序中使用CoreData,一切似乎都很好——除非我在XCode中打开异常断点。每当我执行一些CoreData工作时,断点都会在NSManagedObjectContext上的save:-方法处停止,但之后的NSError为零。我的日志中也没有任何内容(除了:catchpoint2(抛出异常)。),应用程序不会崩溃。。。所以很难判断出哪里出了问题 我唯一的线索是,我在我的NSManagedObjectContext中的updateobjects:中有一个对象,但它似乎没

我在一个多线程的iOS应用程序中使用CoreData,一切似乎都很好——除非我在XCode中打开异常断点。每当我执行一些CoreData工作时,断点都会在
NSManagedObjectContext
上的
save:
-方法处停止,但之后的NSError为零。我的日志中也没有任何内容(除了:
catchpoint2(抛出异常)。
),应用程序不会崩溃。。。所以很难判断出哪里出了问题

我唯一的线索是,我在我的
NSManagedObjectContext
中的
updateobjects:
中有一个对象,但它似乎没有什么问题

我的问题非常类似于,但唯一的答案对我没有帮助;我很确定我已经把一切都准备好了

这里可能出了什么问题?或者是否有其他可能获得一些错误信息

多谢各位

编辑:显示代码相当困难。我正在加载objectID对象,编辑它们并将它们存储在分配给当前线程的上下文中。我已经检查过了-上下文对于当前线程总是正确的;每个线程都有自己的上下文,这不应该是问题所在。如果有人能告诉我如何从错误/异常中获取更多信息,或者如果我必须关心它,这将是非常有帮助的。在我看来,异常似乎是在“save”方法中捕获的,因此可能是“正常”行为?

这是正常行为。CoreData在内部对其某些程序流使用异常抛出和处理。我和CoreData的人谈过这件事。这可能看起来很奇怪,但这是他们很久以前做出的设计决定

当遇到异常时,请确保在调用
-[NSManagedObjectContext save::
和引发异常之间的回溯中没有任何代码。调用
-save:
很可能会回调到代码中,例如,如果您正在观察
nsmanagedObjectContextObjectsIDChangeNotification
,并且如果您在处理这些通知时做了不好的事情,那么显然您是错的

如果退出
-save:
方法,并且返回值为
YES
,则一切正常

请注意,您应该检查返回值,不要使用
error!=nil
检查错误。正确的检查是:

NSError *error = nil;
BOOL success = [moc save:&error];
if (!success) {
    // do error handling here.
}

我也有类似的问题。最终,我解决了问题:

我向NSManagedObjectContextDidSaveNotification添加了一个观测者,该观测者在未将自身从通知中心移除的情况下被释放。当它的内存分配给其他对象时,通知中心尝试调用该对象并引发异常,因为它找不到正确的选择器。由于某种原因,该异常是“不可见的”,但导致CoreData引发了自己的异常

一个位置合适的removeObserver:电话解决了这个问题


希望这可以帮助遇到这种情况的其他人。

你可以避免这些无用的休息;正如其他人所指出的,这是正常的CoreData行为(但非常烦人!)

  • 删除“所有Objective-C异常”断点
  • objc\u异常\u抛出上添加符号断点
  • 将断点上的条件设置为
    (BOOL)(!(BOOL)[[(NSException*)$eax className]hasPrefix:@“\u NSCoreData”])
  • 我还喜欢添加一个操作、调试器命令“po$eax”,它通常打印异常详细信息
  • $eax是模拟器的正确寄存器,$r0在设备上工作。您可以创建两个单独的断点,并根据需要启用/禁用它们


    有关原始答案,请参见。我的代码中出现了类似的问题。我最终发现问题是由于我的模型发生了更改,并且我使用的
    EncryptedCoreData
    NSPersistentStoreCoordinator
    没有设置为自动迁移,正如我过去对MagicalRecord所期望的那样


    唯一的症状是这个断点,没有任何其他消息。通过删除并重新安装应用程序(暂时)解决了此问题,并通过添加模型版本和相应的密钥(NSMigratePersistentStoresAutomaticalyOption:true,NSInFermappingModelAutomaticalyOption:true)永久解决了此问题到我的堆栈设置。

    我也遇到了同样的问题,我发现协调器在出现合并问题时会抛出异常。我已经删除了我的合并策略(默认为错误),之后调用save时,错误指针不再为nil。这也给了我信心,我的代码是好的

    @shannoga显示代码是不可能的,我担心-但是请看我的编辑,谢谢…您在线程之间使用相同的managedObjectContext吗?(上下文不能在线程之间共享)@daveoncode-no;我很确定每个线程都有自己的managedObjectContext。我所分享的只是managedObjectID,而不是上下文和对象模型。没有办法避免这种情况吗?调试时这很烦人,因为我想一直打开一个异常断点。这样,它通常会停止,而不会成为“真正的”异常……不,没有办法避免这种情况。这就是CoreData的工作原理。你可以申请雷达并要求苹果公司更改代码。他们知道这一点,但在CoreData团队的优先级列表中,这可能不是很高。真的吗?我的意思是-你有什么消息来源吗?这将是令人失望的,因为——正如我前面提到的——调试时很烦人:/谢谢!这为我省去了很多痛苦的时间,我一直在努力找出我是否做错了什么。断点设置中应该有一个“反向”断点复选框。这显然不再有效。有人建议他们必须用“name”来代替“className”,但我得到了同样的结果。我有一个真正的exc