2012-09-27 45 views
2

核心数据指导方针建议您使用逆模型建立关系。那里没有问题。如何处理核心数据保留周期

有趣的是,如果你加载了一个对象A,它与B具有多对多的关系,并且走过对象图形,那么最终会产生一个保留周期,并且内存永远不会被释放。

对于简单的对象图,您可以只调用refreshObject:mergeChanges:on来重新对对象进行故障,以便关系不再是强引用。

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

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

是否有任何已知的模式来处理这个问题。我会想象如此,因为很多人使用核心数据我只是找不到任何建议

+0

你怎么知道你首先进入保留循环?是否使用ARC选项? – Eimantas

+0

ARC不会阻止保留周期,它不同于垃圾回收(我已经在使用ARC)。上面的例子说明了在正常使用情况下如何在核心数据中发生保留周期。 – Imran

+2

很多人使用核心数据,你是对的。它已经存在多年了。你需要在第二段中检查你的断言。是这样吗?如果这是核心数据的缺陷,人们会谈论它,你不觉得吗? – Jessedc

回答

1

您在做断言时忽略了核心数据的几个方面。如果您获取一个对象,让我们说对象A,它与对象B具有一对多的关系,当您获取A时,您将拥有B上与A相关的所有对象。一对多关系创建与A相关的对象列表,并将它们包含在NSManagedObject子类的NSSet属性中。请注意,这些对象处于故障状态,并且其内存占用量不明显。如果您操纵关系中的对象,核心数据将在必要时将这些对象置为非故障状态。你不必做任何事情来获得这种行为。如果您想自己触发错误行为以再次发送对象,您可以使用refreshObject:mergeChanges :.如果你不发回他们的错误,最终会再次触发错误行为。

+1

“如果您没有将它们发回过错,最终会再次触发故障行为。”那是在文档中,因为我没有看到它?我有一个印象,你必须手动做,但如果是这样的话,我没有什么可担心的。 – Imran