NSManagedObjectContext:exception断点停在保存:方法,但没有日志/崩溃/错误

我在一个multithreading的iOS应用程序中使用CoreData,并且一切似乎工作正常 – 除非我打开XCode中的exception断点。 每当我做一些CoreData工作,断点停止在NSManagedObjectContextsave: – 方法 – 但NSError之后为零。 我也没有什么在日志(除了: Catchpoint 2 (exception thrown). ),应用程序不会崩溃…所以很难分辨出什么问题。

我唯一的线索是在updatedObjects:有一个单独的对象updatedObjects:在我的NSManagedObjectContext – 但似乎没有错。

我的问题是非常类似于这个问题在stackoverflow ,但唯一的答案并没有帮助我; 我很确定,我已经覆盖了一切。

这里有什么可能是错的? 或者还有其他的可能性来获取一些错误信息?

非常感谢你!

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

这是正常的行为。 CoreData在一些程序stream程中使用exception抛出和处理。 我和CoreData的人讨论过这个问题。 这可能看起来很奇怪,但这是他们很久以前做出的devise决定。

当你遇到这个exception时,确保在你调用-[NSManagedObjectContext save:]和引发exception之间的回溯中没有你的代码。 调用-save:很可能会callback你的代码,例如,如果你正在观察NSManagedObjectContextObjectsDidChangeNotification ,并且如果你在处理这些通知时做的不好,显然你是错的。

如果你正在退出-save:方法,并且返回值是YES ,那么一切都很好。

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

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

你可以避免这些无用的rest。 正如别人指出这是正常的CoreData行为(但非常讨厌!)

  1. 删除“所有Objective-Cexception”断点
  2. objc_exception_throw上添加一个符号断点
  3. 将断点上的条件设置为(BOOL)(! (BOOL)[[(NSException *)$eax className] hasPrefix:@"_NSCoreData"])
  4. 我还想添加一个操作,debugging器命令“po $ eax”,通常会打印出exception详细信息

$ eax是模拟器的正确寄存器,$ r0在设备上工作。 您可以创build两个单独的断点,并根据需要启用/禁用它们。

使用Xcode的“所有exception”断点作为原始答案时,请参阅忽略某些exception

我有一个类似的问题。 最终,我发现了这个问题:

我添加了一个观察员NSManagedObjectContextDidSaveNotification获得释放,而不从通知中心自行删除。 当其内存分配给其他对象时,通知中心尝试调用该对象,并引发exception,因为找不到正确的select器。 这个例外由于某种原因是“隐形的”,但是导致CoreData引发了自己的例外。

一个很好的放置removeObserver:调用修复了这个问题。

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

我的代码中发生了类似的问题。 我终于发现,这个问题是由于我的模型已经改变了,我使用的EncryptedCoreData NSPersistentStoreCoordinator没有设置为自动迁移,因为我以前曾经用过MagicalRecord。

唯一的症状是这个断点,没有任何其他的消息。 它通过删除并重新安装应用程序,并永久性地通过添加模型版本和适当的键( NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true )到我的堆栈设置来解决(暂时)。