Отмена и выпуск объекта

Вопрос новичка.

У меня есть NSMutableArray, который содержит несколько объектов (объектов, в которых хранятся пути Безье и связанные с ними переменные, например, цвет пути и т. Д.). Они правильно высвобождаются при -deallocвызове соответствующего метода. Каждый объект создается +alloc/-initи добавляется в массив. После добавления их в массив I releaseобъекта и, следовательно, их retainCount = 1 (из-за массива). Таким образом, когда массив освобождается, объекты также корректно deallocкорректируются.

Но я также реализую механизм отмены / повторения, который удаляет / добавляет эти объекты из / в массив NSMutable.

Мой вопрос: когда отмена удаляет объект из массива, они не освобождаются (в противном случае повтор не будет работать), поэтому, если повтор не вызывается, как правильно освободить этот объект?

Надеюсь, что это имеет смысл! Спасибо!

16.12.2008 01:35:39
3 ОТВЕТА
РЕШЕНИЕ

Вам не нужно хранить ссылку на объект, с которым вы работаете. Когда вы добавляете операцию в стек отмены (см. NSUndoManager registerUndoWithTarget:), она сохранит аргумент для вас. Например, если вы добавляете объект, используя addObject: (id) obj в своем коде, вы регистрируете его в NSUndoManager, используя ваш removeObject: action и obj в качестве аргумента. Менеджер отмены будет сохранять этот объект до тех пор, пока действие не будет очищено из стека отмены. Если вы переопределите deallocсвой объект и вставите сообщение NSLog (), вы увидите, как именно оно работает.

Если вы не используете NSUndoManager, начните! Это позволяет очень легко получить правильное управление отмены в OS X, и это очень гибко.

3
16.12.2008 04:11:33
Спасибо! Я полагал, что отслеживание в отдельном списке казалось, что должен быть лучший способ. Я использую NSUndoManager - просто привыкаю к ​​Какао и программирую в Oop.
Joe 16.12.2008 07:22:49

Вести отдельный список возможных повторных действий; переместить элемент из активного списка в этот. Отпускайте их только тогда, когда они «недоступны» (пользователь выполняет какое-то другое действие, которое делает список повторов недействительным). Тогда у вас все еще есть ссылка на эти элементы, которые можно очистить, если они никогда не будут возвращены в «активный» стек.

0
16.12.2008 01:54:18

Если вы используете NSUndoManager, то когда вы помещаете в стек новое действие отмены, стек повторных операций очищается, и в этот момент все элементы, находящиеся в стеке повторных операций, освобождаются.

Если вы хотите очистить стеки раньше, вы можете позвонить -removeAllActionsили -removeAllActionsWithTarget:оба из них очистят стеки отмены и повтора.

0
16.12.2008 06:58:45