EXC_BAD_ACCESS在mergeChangesFromContextDidSaveNotification

康威

我们一直在尝试调试Core Data多上下文/线程问题,其中将Core Data保存通知合并到我们的主线程中NSManagedObjectContext会导致应用偶尔崩溃。这使我们的应用会话数量减少了约2%,而如何解决此问题我们感到茫然。对于可能导致此崩溃的原因的任何指导或一般建议,我们将非常感谢。

我们有一个核心数据设置,如下所示:

核心数据栈 注意:这是从[MagicalRecord setupAutoMigratingCoreDataStack]创建的Magical Record v2.3中的默认核心数据堆栈。

这是我们的应用程序崩溃的情况:

  1. HTTP请求返回JSON
  2. NSManagedObjectRoot Saving Context中将JSON解析为s(一些新实体,一些更新实体)
  3. 根保存上下文保存到持久性存储
  4. NSManagedObjectContextDidSaveNotification由Core Data广播。主队列上的默认上下文会观察到此情况,并在主线程上调用mergeChangesFromContextDidSaveNotification:with的NSDictionary更改。
  5. objectID发送到无效对象(很可能NSManagedObject已被释放)时,它崩溃

这是在的私有实现中发生的,NSManagedObjectContext mergeChangesFromContextDidSaveNotification:因此我们无法看到这里实际上出了什么问题。在这一点上,我们所能知道的一切都不存在。

在此处输入图片说明

这仅发生在核心数据保存的一小部分上,这表明这可能不是我们的核心数据→API堆栈中的根本缺陷。此外,没有迹象表明上下文更改的大小(插入/更新/删除)的大小或类型对崩溃的可能性有任何影响。

康威

自从发布此问题以来已经有一段时间了,重新发现之后,我想回答我自己的问题,以便其他人找到该主题。

在我的情况下,我已经从NSManagedObjectContexts通过进行更新的同级迁移了很大的代码库NSManagedObjectContextDidSaveNotification但是,尽管这确实暴露了问题,但问题实际上与它无关。

造成这种情况的真正原因是,以前的工程师设置了代码的较旧部分,并在NSManagedObjects上设置了KVO及其属性。事实证明,在核心数据实体上使用KVO实际上是一个非常非常糟糕的主意。

更准确地说,当在实体上设置KVO并且从中删除了对象或该对象上的关系的目标时,似乎发生了这种情况NSPersistentStore第二种情况似乎不是造成此问题唯一原因,但在我看来,这绝对是一个非常突出的原因。

得到教训:

  1. 必要时使用获取的结果控制器。KVO不是方便的快捷方式,您不应避免将狡猾的Core Data KVO代码迁移到NSFetchedResultsControllers或其他明智的选择,因为拖延会伤害您。
  2. 多线程核心数据是成为专家的一项困难但非常值得的技能。了解您的核心数据堆栈以及核心数据多线程的细微差别和局限性绝对值得所有精神上的痛苦。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

调试EXC_BAD_ACCESS

来自分类Dev

NSDictionary EXC_BAD_ACCESS

来自分类Dev

AFHTTPRequestOperationManager的EXC_BAD_ACCESS

来自分类Dev

SKTexture EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS StringWithFormat

来自分类Dev

EXC_BAD_ACCESS on iOS 8.1 with Dictionary

来自分类Dev

GCD / NSOperationQueue EXC_BAD_ACCESS

来自分类Dev

UIAlertController EXC_BAD_ACCESS错误-Swift

来自分类Dev

指向函数头的EXC_BAD_ACCESS

来自分类Dev

生成nspredicate时EXC_BAD_ACCESS

来自分类Dev

iOS EXC_BAD_ACCESS:如何调试?

来自分类Dev

迅速细分错误(EXC_BAD_ACCESS)

来自分类Dev

如何从EXC_BAD_ACCESS中恢复?

来自分类Dev

SKNode.removeFromParent()EXC_BAD_ACCESS

来自分类Dev

CGContextDrawLinearGradient导致EXC_BAD_ACCESS

来自分类Dev

CCHmac上的EXC_BAD_ACCESS

来自分类Dev

使用NativeCSS时EXC_BAD_ACCESS

来自分类Dev

在AVAssetReader中获取Exc_Bad_access

来自分类Dev

来自Apple Subthread的EXC_BAD_ACCESS

来自分类Dev

[UICollectionView setCollectionViewLayout:]上的EXC_BAD_ACCESS

来自分类Dev

使用协议组成的EXC_BAD_ACCESS

来自分类Dev

viewForAnnotation中的EXC_BAD_ACCESS

来自分类Dev

NSTableView与源,导致EXC_BAD_ACCESS

来自分类Dev

Swift中的UIWebView:exc_bad_access

来自分类Dev

MIDINetworkConnection EXC_BAD_ACCESS错误

来自分类Dev

Swift:animator()导致EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS Sprite套件

来自分类Dev

Swift中的UIDocumentInteractionControllerDelegate EXC_BAD_ACCESS

来自分类Dev

UIWebview:WebThread EXC_BAD_ACCESS