NSUndoManager是否保留对象?

时间:2010-11-23 03:12:02

标签: 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输出显示了预期的不同地址。

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

根据文档,prepareWithInvocationTarget:方法不保留传递给它的参数。在NSUndoManager文档中,它似乎只是捕获NSInvocation,然后重播它。除非特别要求,否则NSInvocation个对象不会在对象中保留对象。

这并不能解释崩溃,因为removeAllActions只是为了清除撤销堆栈而不对对象做任何事情。

希望这可以帮助一些人追踪崩溃的来源。

答案 1 :(得分:0)

根据我的经验,这不是发布/保留问题。撤消/重做操作后,您必须清除堆栈。为此,您可以为NSUndoManagerDidUndoChangeNotification通知注册viewController:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearUndoRedoStack) name:NSUndoManagerDidUndoChangeNotification object:nil];

然后将堆栈清除到指定的方法:

- (void)clearUndoRedoStack {
    [undoManager removeAllActions];
}