我执行以下操作:
Path2D *pathToRemove = [path copy];
[[[self undoManager] prepareWithInvocationTarget:self] removePath:pathToRemove atIndex:index];
[pathToRemove autorelease];我也有一个清晰的按钮,它可以:
[undoManager removeAllActions];问题是removeAllActions会使应用程序崩溃。当我删除pathToRemove自动释放时,它工作了(或者至少没有崩溃。这仍然可能是内存泄漏)。我猜我假设undoManager在传入'prepareWithInvocationTarget‘调用时保留了'pathToRemove’。
难道不是这样吗?如果不是这样,则可能会发生崩溃,因为对'removeAllActions‘的调用释放了'PathToRemove’对象。但这将意味着这是NSUndoManager中的一个错误,这是非常不可能的。
我可以说我的copyWithZone实现也不太可能是罪魁祸首,因为'pathToRemove description‘和'path description’的NSLog输出像预期的那样显示了不同的地址。
任何帮助都将不胜感激。谢谢。
发布于 2010-11-23 12:04:36
根据文档,prepareWithInvocationTarget:方法不保留传递给它的参数。从NSUndoManager文档中看,它似乎只是捕获NSInvocation并在以后重放它。除非特别要求,否则NSInvocation对象不会在其参数中保留对象。
这并不能完全解释崩溃的原因,因为removeAllActions只是应该清除撤销堆栈,而不是对对象做任何事情。
希望这能帮助一些人追查崩溃的根源。
发布于 2011-07-27 19:24:13
根据我的经验,这不是一个释放/保留的问题。在Undo/Redo操作之后,您必须清除堆栈。为此,您可以为NSUndoManagerDidUndoChangeNotification通知注册您的viewController:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearUndoRedoStack) name:NSUndoManagerDidUndoChangeNotification object:nil];然后清除堆栈到指定的方法上:
- (void)clearUndoRedoStack {
[undoManager removeAllActions];
}https://stackoverflow.com/questions/4252428
复制相似问题