NSUndoManager是否保留对象?

我做以下事情:
    Path2D *pathToRemove = [path copy];
    [[[self undoManager] prepareWithInvocationTarget:self] removePath:pathToRemove atIndex:index];
[pathToRemove autorelease];
我还有一个清晰的按钮:
[undoManager removeAllActions];
问题是removeAllActions崩溃了应用程序。当我删除[pathToRemove autorelease]时,它工作(或者至少没有崩溃。它仍然可能是内存泄漏)。我想我假设当在“prepareWithInvocationTarget”调用中传递时,undoManager保留了“pathToRemove”。 那不是这样吗?如果不是这种情况,则可能发生崩溃,因为对'removeAllActions'的调用正在释放'PathToRemove'对象。但这意味着它是NSUndoManager中的一个错误,这是不太可能的。 我可以说我的copyWithZone实现不太可能是罪魁祸首,因为'[pathToRemove description]'和'[path description]'的NSLog输出显示了预期的不同地址。 任何帮助,将不胜感激。谢谢。     
已邀请:
根据文档,
prepareWithInvocationTarget:
方法不保留传递给它的参数。从
NSUndoManager
文档中可以看出,它只是捕获了
NSInvocation
,然后重放它。除非特别要求,否则
NSInvocation
objects不会将对象保留在其参数中。 这并没有完全解释崩溃,因为
removeAllActions
应该清除撤销堆栈而不对对象做任何事情。 希望这有助于一些人追踪崩溃的来源。     
根据我的经验,这不是发布/保留问题。撤消/重做操作后,您必须清除堆栈。为此,您可以为NSUndoManagerDidUndoChangeNotification通知注册viewController:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearUndoRedoStack) name:NSUndoManagerDidUndoChangeNotification object:nil];
然后将堆栈清除到指定的方法:
- (void)clearUndoRedoStack {
    [undoManager removeAllActions];
}
    

要回复问题请先登录注册