我执行以下操作:
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输出显示了预期的不同地址。
任何帮助将不胜感激。感谢。
答案 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];
}