ios - 调试核心数据 __NSCFSet addObject nil 异常

标签 ios multithreading core-data method-swizzling swizzle

我在单元测试期间在 Core Data 线程上收到异常抛出消息:

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'
*** First throw call stack:
(
    0   CoreFoundation                      0x00683a14 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x02334e02 objc_exception_throw + 50
    2   CoreFoundation                      0x0068393d +[NSException raise:format:] + 141
    3   CoreFoundation                      0x005595b9 -[__NSCFSet addObject:] + 185
    4   CoreData                            0x001d47c0 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processPendingInsertions:withDeletions:withUpdates:] + 560
    5   CoreData                            0x001cee8a -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2410
    6   CoreData                            0x001ce506 -[NSManagedObjectContext processPendingChanges] + 54
    7   CoreData                            0x001f359b developerSubmittedBlockToNSManagedObjectContextPerform + 443

我试图确定是什么导致了它,但由于它发生在 NSManagedObjectContext 队列上,因此该线程没有任何我自己的代码的堆栈跟踪。

我在 -[__NSCFSet addObject:]-[NSManagedObjectContext processPendingChanges] 上设置了符号断点,但停在那里时看不到任何状态,帮助我确定哪些对象导致了问题。

我想到的下一步是尝试调配 -[__NSCFSet addObject:] 以添加我自己的实现,这样我就可以仅在参数为 nil 时停止。希望该集合不为空,并且我可以在插入 nil 之前查看其内容来获取更多信息。不过,我在调整它时遇到了困难,因为它是私有(private)类(class)。

使用上述方法或我没有考虑过的方法,我如何才能获得有关导致异常的原因的更多信息?

最佳答案

感谢@bteapot 建议我将 -com.apple.CoreData.ConcurrencyDebug 1 参数添加到我的方案中。我从 Ole Begemann 的优秀文章 Core Data Concurrency Debugging 中获得了有关其工作原理的更多信息。文章。

添加此标志会导致在您的代码从不正确的线程调用您的 NSManagedObjectContext 时立即抛出异常。这在 Xcode 中效果很好,但请注意,在 Xcode Bot 中,这会导致测试失败并显示以下无用消息:

Lost connection to test manager service

关于ios - 调试核心数据 __NSCFSet addObject nil 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34658592/

相关文章:

c# - 如何测试线程安全

core-data - TRUEPREDICATE 与 [NSPredicate predicateWithValue :YES]? 有何不同

ios - 将 SubView 添加到 UITableViewCell 不会显示

ios - Swift:DismissViewController() 和关闭键盘的线程问题

ios - 在后台将位置发送到服务器 - ios 7

java - 使用 Aggregator + Redis 的死锁

ios - 将旧的 CoreData 模型导入新项目

ios - 核心数据 : Can't find model for source store - only in simulator?

iOS:如何创建一行相同百分比宽度的控件

ios - 缺少必需的图标文件。该 bundle 不包含 iPhone/iPod Touch 的应用程序图标正好为“1024x1024”