2008-12-16 56 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:,但這兩者都會清除撤銷和重做堆棧。