2008-12-16 63 views
1

新手问题。撤消和对象发布

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

但是,我也实现了撤销/重做机制,消除/自/至NSMutable阵列添加这些对象。

我的问题是,当撤消删除该数组对象,他们不会释放(否则重做将无法正常工作),所以如果重做不会被调用,你怎么正确地释放这些对象?

希望有道理!谢谢!

回答

3

你并不需要保持你正在使用的对象的引用。当您将操作添加到撤消堆栈(请参阅NSUndoManager registerUndoWithTarget:)时,它将为您保留参数。例如,如果您在代码中使用addObject:(id)obj添加对象,则可以使用removeObject:action和obj作为参数将其注册到NSUndoManager。撤销管理器将保留该对象,直到撤销堆栈中的操作被清除。如果在对象中覆盖dealloc并放入NSLog()消息,您将看到它的工作原理。

如果你不使用NSUndoManager,开始!这使得在OS X中进行正确的撤消管理变得非常容易,而且非常灵活。

+0

谢谢!我想保持一个单独的列表似乎应该有一个更好的方法。我正在使用NSUndoManager - 只是习惯了可可和OOP编程。 – Joe 2008-12-16 07:22:49

0

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

+0

谢谢。我会记住它。 – Joe 2008-12-16 07:24:26

0

如果您使用NSUndoManager那么当你把堆栈重做堆栈被清除,并在该点是重做堆栈上的任何物品都发布了新的撤消操作。

如果您想早些时候清除堆栈,可以拨打-removeAllActions-removeAllActionsWithTarget:,但这两者都会清除撤销和重做堆栈。