首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSUndoManager是否保留对象?

NSUndoManager是否保留对象?
EN

Stack Overflow用户
提问于 2010-11-23 11:12:02
回答 2查看 1.4K关注 0票数 0

我执行以下操作:

代码语言:javascript
复制
    Path2D *pathToRemove = [path copy];
    [[[self undoManager] prepareWithInvocationTarget:self] removePath:pathToRemove atIndex:index];
[pathToRemove autorelease];

我也有一个清晰的按钮,它可以:

代码语言:javascript
复制
[undoManager removeAllActions];

问题是removeAllActions会使应用程序崩溃。当我删除pathToRemove自动释放时,它工作了(或者至少没有崩溃。这仍然可能是内存泄漏)。我猜我假设undoManager在传入'prepareWithInvocationTarget‘调用时保留了'pathToRemove’。

难道不是这样吗?如果不是这样,则可能会发生崩溃,因为对'removeAllActions‘的调用释放了'PathToRemove’对象。但这将意味着这是NSUndoManager中的一个错误,这是非常不可能的。

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

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

EN

回答 2

Stack Overflow用户

发布于 2010-11-23 12:04:36

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

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

希望这能帮助一些人追查崩溃的根源。

票数 2
EN

Stack Overflow用户

发布于 2011-07-27 19:24:13

根据我的经验,这不是一个释放/保留的问题。在Undo/Redo操作之后,您必须清除堆栈。为此,您可以为NSUndoManagerDidUndoChangeNotification通知注册您的viewController:

代码语言:javascript
复制
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearUndoRedoStack) name:NSUndoManagerDidUndoChangeNotification object:nil];

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

代码语言:javascript
复制
- (void)clearUndoRedoStack {
    [undoManager removeAllActions];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4252428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档