【问题标题】:How to deal with Core Data retain cycles如何处理 Core Data 保留周期
【发布时间】:2012-09-19 10:07:26
【问题描述】:

核心数据指南建议您使用逆向建模您的关系。没有问题。

有趣的是,如果您加载一个与 B 具有多对多关系的对象 A 并遍历对象图,您最终会得到一个保留循环并且内存永远不会被释放。

对于简单的对象图,您只需在 A 上调用 refreshObject:mergeChanges: 即可重新故障对象,从而使关系不再是强引用。

如果你有一个复杂的对象图,虽然这很痛苦,因为你需要在你接触过的每个对象上调用它。在使用核心数据时,这似乎是一个非常重要的考虑因素,但 Apple 文档中只有一段关于此主题。

我只是想知道其他人如何处理这个问题?一个长时间运行的应用程序会慢慢地消耗越来越多的内存,而不需要某种手动过程来强制对象恢复故障。

是否有任何已知的模式来处理这个问题。我想是这样,因为很多人都使用 Core Data,所以我找不到任何建议

【问题讨论】:

  • 很多人使用核心数据,你是对的。它已经存在多年了。您需要在第二段中检查您的断言。是这样吗?如果这是核心数据的缺陷,人们会谈论它,你不觉得吗?
  • 这是苹果文档中所述的行为。这里还有另一个堆栈溢出问题:stackoverflow.com/questions/1789974/core-data-and-retain-cycles。 Apple 文档也这样说:developer.apple.com/library/mac/#documentation/cocoa/Conceptual/…。也许我误解了这一点,但我不明白怎么做?
  • 我并不是说这是一个缺陷,因为他们指定了一种打破保留周期的方法,我更想知道当你有一个大对象图或任何特定的核心数据使用时是否有更好的方法来做到这一点避免/减少这种情况的模式。
  • 是的,正如我在帖子中提到的那样。
  • 我在看同样的东西。打破保留周期似乎是一种非常糟糕的方法。它需要在其他情况下不需要的明确干预。我相信您还需要确保在调用此对象之前该对象没有未保存的数据。

标签: iphone ios core-data memory automatic-ref-counting


【解决方案1】:

在做出断言时,您忽略了核心数据的几个方面。如果您获取一个对象,假设对象 A 与对象 B 具有一对多关系,当您获取 A 时,您将拥有 B 上与 A 相关的所有对象。一对多关系创建与 A 相关的对象列表,并将它们包含在 NSManagedObject 子类的 NSSet 属性中。请注意,这些对象处于故障状态,并且由此产生的内存占用是微不足道的。如果您操作关系中的对象,核心数据将在必要时对这些对象进行无故障处理。您无需执行任何操作即可获得此行为。如果您想自己触发故障行为以再次将对象发送到故障,您可以使用 refreshObject:mergeChanges:。如果不将它们送回故障,最终将再次触发故障行为。

【讨论】:

  • "如果您不将它们送回故障,最终将再次触发故障行为。"那是在文档中,因为我没有看到它吗?我的印象是你必须手动完成,但如果是这样的话,我就没什么好担心的了。
猜你喜欢
  • 1970-01-01
  • 2011-03-14
  • 2018-05-13
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多