Очистка стека отмены
При использовании менеджеров по отмене в считаемой на ссылку среде необходимо быть осторожны относительно проблем, связанных с управлением памятью. NSUndoManager
объект не сохраняет цели операций отмены. Клиент — объекту, выполняющему операции отмены — обычно, принадлежит менеджер по отмене, поэтому если бы менеджер по отмене поочередно сохранил ее цель, то это часто создавало бы сохранить цикл. Это означает, тем не менее, что менеджер по отмене может потенциально содержать ссылку на освобожденный объект. Если целевой объект был освобожден, и сообщение отмены отправляется в него, это приводит к исключению на этапе выполнения.
Для принятия мер против этого необходимо заботиться для очистки операций отмены для освобождающихся целей. Вы обычно делаете это одним из трех способов, в зависимости от конфигурации клиента:
Клиент является монопольным владельцем менеджера по отмене и целью всех операций отмены.
В этом случае клиент может просто выпустить менеджера по отмене в
dealloc
метод.Клиент совместно использует менеджера по отмене с другими клиентами.
Для обработки этого, клиент должен отправить
removeAllActionsWithTarget:
(передачаself
как параметр) менеджеру по отмене прежде, чем выпустить его вdealloc
метод.Клиент регистрирует объекты кроме себя для операций отмены.
Здесь любой, которого клиент должен наблюдать за другими объектами, освобождаемыми для отправки
removeAllActionsWithTarget:
, или другие объекты должны сделать так себя, когда освобождено (который требует, чтобы у них была ссылка на менеджера по отмене). Это, вероятно, будет необходимо с основанной на вызове отменой.
В более общем смысле это иногда целесообразно очищать всю отмену и операции восстановления. Некоторые приложения могли бы хотеть сделать это при сохранении документа, например. С этой целью, NSUndoManager
определяет removeAllActions
метод, очищающий оба штабеля.