如何使 NSManagedObject 不会出错?

And*_*kha 4 core-data objective-c ios

我目前正在调试另一个开发人员编写的一个大项目。该项目使用CoreData我很陌生。我遇到了崩溃,这是由于某些NSManagedObject是错误的(我对错误是什么不太了解),我想将对象转换为“非错误”,看看它是否有帮助。阅读文档让我认为这to make object not fault等于to fire fault(再次我对什么是“触发”的理解很差),所以我决定通过调用它的任何方法来触发它,并且这个方法是hasChanges因为它不在方法列表中不要火过错。然而,即使在调用这个方法之后,对象仍然是错误的。谁能给我一个如何转换NSManagedObject为“非故障”状态的例子?

Tom*_*ton 5

您在评论中提到的例外是:

Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x1f0627a0 <x-coredata://E40418A0-A8E5-4340-865F-A9DA2E0095DD/CoreObject/p288>''
Run Code Online (Sandbox Code Playgroud)

“无法满足故障”消息表明这不仅仅是触发故障的问题。事实上,触发故障没有特殊步骤——您只需访问属性,如有必要,故障会自动触发。

这个错误告诉你的是你正在做一些导致故障触发的事情,但是 Core Data 找不到你正在使用的实例的任何记录。这可能发生在某些情况下,例如:

  1. 获取一个对象,并将其作为错误(即不访问任何属性)
  2. 从 Core Data 中删除它,但保留对对象的引用(可能在实例变量中)
  3. 保存更改
  4. 尝试访问您在步骤 1 中获取的对象的属性。

此时 Core Data 通常会使用该对象来查找属性值。但是你已经删除了,所以属性数据就没了。Core Data 抛出这个异常。

还有一些其他场景可以触发这种情况——调用reset托管对象上下文,同时保留先前获取的对象,或者删除持久存储(以便数据仍然存在于存储文件中,但不再加载该文件) . 一般来说,这意味着 Core Data 正在尝试在不再有效的对象上查找数据。

你需要做什么:

  • 找出导致这种情况的对象。设置异常断点,以便在崩溃发生时加载调试器,这可能是一个好主意。
  • 摆脱那个对象。防止故障触发可能会防止这种特定的崩溃,但只要您仍然拥有这个对象,它就像您的应用程序中的地雷。只要您触摸它,它就会爆炸并使应用程序崩溃。
  • 弄清楚为什么你有无效的托管对象潜伏在内存中。也许你应该早点摆脱它们?也许您不小心删除了不想删除的内容?出于某种原因,当托管对象不再有效时,您会保留它们。这是导致您遇到麻烦的核心问题。