如何强制NSUndoManager prepareWithInvocationTarget保留它的参数?

时间:2013-06-20 12:38:07

标签: ios nsundomanager nsinvocation

NSUndoManager方法prepareWithInvocationTarget 不保留参数。在Apple文档中没有这个链接,但是我已经用profiler查看了,我很确定 - 但事实并非如此。这意味着如果您要删除一个对象并准备撤消 - 您应该自己保留它(比如将其分配给某些垃圾数组并删除原始链接)。那些假移除会产生很多不必要的麻烦,特别是当你需要摆脱旧的undos时。

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

问题是 - 怎么做?

2 个答案:

答案 0 :(得分:2)

它位于Undo Architecture指南中

  

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

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

您必须自己管理实时周期。完全取决于您的应用程序模型并完全具体。我想一般问题归结为:

我们如何知道NSUndoManager何时会弹出'撤消堆栈中的操作(因此我们可以安全地删除我们为撤消操作保留的上下文数据。)

很遗憾,NSUndoManager Class Reference发送的通知中没有(已记录的)通知,例如在撤消管理器实例上调用removeAllActionsWithTarget:时。

似乎没有真正的替代方法可以永久保留这些附加信息(或手动limit the levels of undo并相应地调整撤消上下文数据的存储空间。)

答案 1 :(得分:0)

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