撤消和对象释放

时间:2008-12-16 01:35:39

标签: objective-c cocoa

新手问题。

我有一个NSMutableArray,它包含多个对象(存储Bezier路径和相关变量的对象,例如路径颜色等)。只要调用相关的-dealloc方法,就会正确释放这些对象。每个对象都使用+alloc/-init进行实例化,并添加到数组中。将它们添加到数组I release对象后,因此它们的retainCount = 1(由于数组)。因此,当阵列被释放时,对象也正常dealloc

但是,我还在实现一个撤消/重做机制,从/向NSMutable数组中删除/添加这些对象。

我的问题是,当撤消从数组中删除对象时,它们不会被释放(否则重做将不起作用)所以如果从不调用重做,那么如何正确释放这些对象?

希望有道理!谢谢!

3 个答案:

答案 0 :(得分:3)

您无需保留对正在使用的对象的引用。当您向撤消堆栈添加操作时(请参阅NSUndoManager registerUndoWithTarget:),它将为您保留参数。例如,如果在代码中使用addObject:(id)obj添加对象,则应使用removeObject:action和obj作为参数将其注册到NSUndoManager。撤消管理器将保留该对象,直到从撤消堆栈清除操作为止。如果您在对象中覆盖dealloc并输入NSLog()消息,您将确切地看到它是如何工作的。

如果您没有使用NSUndoManager,请启动!它使得在OS X中获得适当的撤销管理变得非常容易,并且它非常灵活。

答案 1 :(得分:0)

维护一份单独的潜在重做行动清单;将项目从活动列表移动到此列表。只有在“无法访问”时才释放它们(用户执行一些其他操作使重做列表无效)。然后,您仍然可以参考这些项目,如果它们永远不会被放回“活动”堆栈,则可以清理这些项目。

答案 2 :(得分:0)

如果您正在使用NSUndoManager,那么当您在堆栈上放置新的撤消操作时,将清除重做堆栈,此时将释放重做堆栈上的所有项目。

如果您想先清除堆栈,可以调用-removeAllActions-removeAllActionsWithTarget:,但这两个都会清除撤消和重做堆栈。