我在单元测试期间在 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/