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