2

NSUndoManager 方法 prepareWithInvocationTarget不保留参数。Apple docs 中没有指向此的链接,但我已经使用分析器进行了检查,我很确定 - 它没有。这意味着如果您要删除一个对象并准备撤消 - 您应该自己保留它(例如将其分配给某个垃圾数组并删除原始链接)。那些虚假的删除会造成很多不必要的麻烦,尤其是当您需要摆脱旧的撤消操作时。

但是,NSInvocation可以通过调用 retainArguments 方法来保留参数。由于 NSUndoManager 将 NSInvocation 用于 prepareWithInvocationTarget,因此它可能是将 retainArguments 传递给 NSUndoManager 的方式。

问题是 - 怎么做?

4

2 回答 2

2

它就在撤消架构指南中:

NSUndoManager 对象不保留撤消操作的目标。客户端(执行撤消操作的对象)通常拥有撤消管理器,因此如果撤消管理器反过来保留其目标,这将经常创建一个保留周期。

所以,它没有 - 由于文档中给出的原因。

您必须自己管理生命周期。完全取决于您的应用程序模型并且完全特定于您的应用程序模型。我想一般问题可以归结为:

我们如何知道 NSUndoManager 何时会从撤消堆栈中“弹出”一个动作(这样我们就可以安全地删除我们为撤消操作保留的上下文数据)。

不幸的是,在NSUndoManager 类参考中没有(记录的)通知发送,例如在removeAllActionsWithTarget:撤消管理器实例上调用时。

几乎似乎没有真正的替代方法可以永久保留这些附加信息(或手动限制撤消级别并相应地调整撤消上下文数据的存储)。

于 2014-03-17T18:21:37.373 回答
0

虽然给出的关于目标的答案是正确的,但关于参数的答案是:没有必要保留它们,因为撤消管理器会这样做。请参阅NSUndoManager 是否保留其参数?

于 2015-01-02T09:44:24.583 回答