NSUndoManager方法prepareWithInvocationTarget 不保留参数。在Apple文档中没有这个链接,但是我已经用profiler查看了,我很确定 - 但事实并非如此。这意味着如果您要删除一个对象并准备撤消 - 您应该自己保留它(比如将其分配给某些垃圾数组并删除原始链接)。那些假移除会产生很多不必要的麻烦,特别是当你需要摆脱旧的undos时。
但是,NSInvocation 可以通过调用retainArguments方法保留参数。由于NSUndoManager使用NSInvocation进行prepareWithInvocationTarget,因此可能是将retainArguments传递给NSUndoManager的方法。
问题是 - 怎么做?
答案 0 :(得分:2)
它位于Undo Architecture指南中
NSUndoManager对象不保留撤消的目标 操作。客户端 - 通常执行撤消操作的对象 拥有撤消管理器,因此如果撤消管理器依次保留它 目标,这将经常创建一个保留周期。
所以否,它没有 - 由于文档中给出的原因。
您必须自己管理实时周期。完全取决于您的应用程序模型并完全具体。我想一般问题归结为:
我们如何知道NSUndoManager何时会弹出'撤消堆栈中的操作(因此我们可以安全地删除我们为撤消操作保留的上下文数据。)
很遗憾,NSUndoManager Class Reference发送的通知中没有(已记录的)通知,例如在撤消管理器实例上调用removeAllActionsWithTarget:
时。
似乎没有真正的替代方法可以永久保留这些附加信息(或手动limit the levels of undo并相应地调整撤消上下文数据的存储空间。)
答案 1 :(得分:0)
虽然给出的答案对于目标是正确的,但关于参数的答案是:没有必要保留它们,因为撤消管理器会这样做。见Does NSUndoManager retain its arguments?