0

我执行以下操作:

    Path2D *pathToRemove = [path copy];
    [[[self undoManager] prepareWithInvocationTarget:self] removePath:pathToRemove atIndex:index];
[pathToRemove autorelease];

我还有一个清除按钮:

[undoManager removeAllActions];

问题是 removeAllActions 使应用程序崩溃。当我删除 [pathToRemove autorelease] 时,它起作用了(或者至少没有崩溃。它仍然可能是内存泄漏)。我想我假设 undoManager 在传入“prepareWithInvocationTarget”调用时保留了“pathToRemove”。

不是这样吗?如果不是这种情况,则可能会发生崩溃,因为对“removeAllActions”的调用正在释放“PathToRemove”对象。但这意味着它是 NSUndoManager 中的一个错误,这是极不可能的。

我可以说我的 copyWithZone 实现也不太可能是罪魁祸首,因为 '[pathToRemove description]' 和 '[path description]' 的 NSLog 输出按预期显示不同的地址。

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

4

2 回答 2

2

根据文档,该prepareWithInvocationTarget:方法不保留传递给它的参数。从NSUndoManager文档中可以看出,它只是简单地捕获了它,NSInvocation然后再重放它。NSInvocation除非特别要求,否则对象不会在其参数中保留对象。

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

希望这有助于一些人追查崩溃的根源。

于 2010-11-23T04:04:36.470 回答
0

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

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

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

- (void)clearUndoRedoStack {
    [undoManager removeAllActions];
}
于 2011-07-27T11:24:12.783 回答