如何丢弃对使用接收器获取的任何托管对象的引用?

Posted

技术标签:

【中文标题】如何丢弃对使用接收器获取的任何托管对象的引用?【英文标题】:How to discard references to any managed objects fetched using the receiver? 【发布时间】:2010-06-11 07:54:11 【问题描述】:

NSManagedObjectContext 的 -reset 方法的文档令人困惑...

所有接收者的托管对象都是 “忘记了。”如果你使用这种方法, 你应该确保你也 丢弃对任何托管的引用 使用接收器获取的对象, 因为之后它们将无效。

那是什么意思?当我从持久存储中获取任何对象,然后重置我的上下文时,我将如何“丢弃引用”?为什么我必须这样做?

【问题讨论】:

【参考方案1】:

如果您在代码中的某处从商店获取 NSManagedObject,然后在其他地方重置上下文,现在您更改 ManagedObject 并尝试通过上下文将其持久保存到商店(已重置并且没有引用任何对象)它会使您的应用崩溃。

上下文是一个“便签本”,它可以“访问”商店中的所有东西,但它只处理/已绘制的对象,您在应用程序启动后通过它检索到的对象。 当您读取 NSManagedObject 时,上下文(据我所知)会复制并跟踪您对其所做的所有更改,在您持久保存之前它对存储没有任何作用。这就是核心数据中的内存管理和撤消重做等轻松实现的原因。

因此重置上下文也会丢弃这些更改,并且没有任何东西可以保存到存储中。

编辑://添加

你不应该太在意的参考。您不必释放它或类似的东西,Core Data 会处理这些,只是不要引用 ManagedObject,自动释放池将丢弃它。

【讨论】:

不确定我是否可以遵循:当我为特定上下文创建托管对象,然后在保存之前重置上下文时,我可以通过在 -reset 之后调用 -save 来使应用程序崩溃?这不是 Core Data 中的错误吗?那不应该发生。 -reset 应该把它扔掉,而 -save 应该知道什么都没有。还是我弄错了? 您好,我不认为这会使应用程序崩溃,上下文具有我认为 Core Data 在执行任何操作之前会检查的 hasChanged 属性。因此,“干净”的上下文不会被持久化。崩溃部分是如果您在重置后引用 ManagedObject、更改它或被释放它的自动释放池捕获。 ______________ 我有点感觉您正在尝试做一些事情,例如使用 managedObject 进行临时存储,然后丢弃上下文以摆脱不需要的上下文?这通常是个坏主意:((当然我只是在猜测……如果错了,请见谅) 哈哈,不,我没试过。我所尝试的只是完全理解核心数据。这就是我对每一种方法都感兴趣的原因。 我试过这个:我为基于视图的 iPhone 应用程序使用了默认的核心数据模板。在我创建的 insertNewObject 方法中,最后调用了 -reset。没有崩溃。但是,当我插入另一个新对象时,整个应用程序立即在调用 -save 的行上崩溃,告诉某个托管对象已被释放。现在我不确定这是否是因为 NSFetchedResultsController 以某种方式引用了所有对象。 不确定我理解你在做什么。 Core Data 中的内存管理是无情的,这就是为什么它可以在 iPhone 内存有限的情况下处理大量对象。这是一个 API,它真的让你因为没有遵循最佳实践而感到痛苦。因此,请尝试将在您的应用程序周围传递您的托管对象限制在最低限度。通常最好得到对象,使用它,如果你改变了一些东西,坚持它,否则就忘了它。你读过指南吗?这是几个小时的“乐趣”:developer.apple.com/mac/library/documentation/cocoa/conceptual/…

以上是关于如何丢弃对使用接收器获取的任何托管对象的引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何:创建用于绘制的 Graphics 对象

GC垃圾回收器

C++/CLI:返回对非托管对象的引用

批量更新后更新托管对象上下文中的托管对象

如何在从父窗口创建的 iframe 的 onload 处理程序中获取对 iframe 窗口对象的引用

《精通C#》第十三章 对象的生命周期