7

我最近注意到 Core Data 中关于撤消机制的一个奇怪的事情,从那以后它一直困扰着我。

NSManagedObjectContext方法文档中的引用-undo

向接收者的撤消管理器发送撤消消息,要求它撤消应用于对象图中对象的最新未提交更改。

要反转最新的未提交更改,听起来很简单,对吧?

然而,实际情况并非如此!即使我保存了对托管对象进行更改的上下文,以下-undo调用仍将成功撤消更改。这不违反文档中所述的内容吗?

也许我做错了什么?如果需要,我可以发布我的小测​​试代码。我真的很困惑。

4

1 回答 1

5

应该感到困惑。Core Data 文档一团糟。他们以不恰当的方式使用了很多诸如“未承诺”之类的词。当他们说“未提交”时,它们似乎意味着属性isFaulted等于 NO 的对象。

核心数据编程指南更详细:

更改和撤消管理

上下文保持对具有挂起更改(插入、删除或更新)的托管对象的强引用,直到向上下文发送 save:、reset、rollback 或 dealloc 消息,或适当数量的撤消来撤消更改。

与上下文关联的撤消管理器保持对任何更改的托管对象的强引用。默认情况下,在 OS X 中,上下文的撤消管理器保持无限的撤消/重做堆栈。为了限制应用程序的内存占用,您应该确保removeAllActions在适当的时候清理(使用)上下文的撤消堆栈。除非您保留对上下文的撤消管理器的强引用,否则它将与上下文一起释放。

文档中的措辞/词汇不清晰或不一致。我相信预期的用途是您应该在适合您的应用程序时调用removeAllActions上下文的属性,以避免无限的内存增长。undoManager

于 2013-02-13T03:28:36.150 回答