如何强制 NSUndoManager prepareWithInvocationTarget 保留其参数?



NSUndoManager方法prepareWithInvocationTarget 不保留参数。苹果文档中没有这个链接,但我已经检查了profiler,我很确定-它没有。这意味着,如果您要删除一个对象并准备撤销它,您应该自己保留它(比如将它分配给一些垃圾数组并删除原始链接)。这样的删除会产生很多不必要的麻烦,特别是当你需要删除旧的undo时。

然而,NSInvocation 可以通过调用retainArguments方法来保留参数。因为NSUndoManager在prepareWithInvocationTarget中使用了NSInvocation,所以可以将retainArguments传递给NSUndoManager。

问题是——怎么做?

就在Undo Architecture指南中:

NSUndoManager对象不保留undo的目标操作。客户端(执行撤消操作的对象)通常是拥有撤消管理器,所以如果撤消管理器反过来保留它的这将经常创建一个保留循环。

所以,它没有——原因在文档中给出。

你必须自己管理活周期。如何完全取决于并完全特定于你的应用模型。我想这个问题可以归结为:

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

不幸的是,在NSUndoManager类引用中没有(记录的)通知被发送,例如当removeAllActionsWithTarget:在undo manager实例上被调用时。

似乎没有真正的替代方法来永久保存这些额外的信息(或者手动限制撤销级别并相应地调整撤销上下文数据的存储)。

虽然给出的答案就目标而言是正确的,但关于参数的答案是:不需要保留它们,因为撤消管理器会这样做。参见NSUndoManager是否保留其参数?

相关内容

  • 没有找到相关文章

最新更新