4

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

4

2 回答 2

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>''

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

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

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

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

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

你需要做什么:

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

故障是根据需要从数据库中获取对象和/或其属性的过程。

例如,如果您尝试访问某个对象的属性或关系person.name,则该对象可能没有其数据在内存中,并且必须从底层数据存储中获取它。这是一个错误。

故障是 Core Data 工作方式的正常部分,不应与崩溃有关。当您尝试访问其属性和关系时,该对象将是无故障的。

于 2013-08-16T10:26:35.843 回答