2013-06-20 2 views
2

Метод NSUndoManager prepareWithInvocationTarget не поддерживает аргументы. В документах Apple нет ссылок на это, но я проверил с профилировщиком, и я уверен, что нет. Это означает, что если вы собираетесь удалить объект и быть готовым к отмене - вы должны сохранить его самостоятельно (например, назначить его некоторому мусорному массиву и удалить исходную ссылку). Такого рода подделка удаляет создает много ненужной суеты, особенно когда вам нужно избавиться от старых отскоков.Как заставить NSUndoManager prepareWithInvocationTarget сохранить свои аргументы?

Однако NSInvocation может сохранять аргументы путем вызова метода keepArguments. Поскольку NSUndoManager использует NSInvocation для prepareWithInvocationTarget, это может быть способ передать keepArguments в NSUndoManager.

Вопрос в том, как это сделать?

ответ

2

Это прямо в Undo Architecture руководстве:

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

Так Нет, это не делает - по причинам, указанным в документации.

Вам придется управлять живыми циклами самостоятельно. Как полностью зависит и полностью зависит от вашей модели приложений. Думаю, общий вопрос сводится к следующему:

Как мы узнаем, когда NSUndoManager «вытащит» действие из стека отмены (чтобы мы могли безопасно удалите наши контекстные данные, которые мы поддерживаем для операции отмены).

К сожалению, в NSUndoManager Class Reference не зарегистрировано (зарегистрированное) уведомление, которое отправлено, например. когда removeAllActionsWithTarget: вызывается в экземпляре менеджера отмены.

Похоже, нет реальной альтернативы держать эту дополнительную информацию навсегда (или вручную limit the levels of undo и соответствующим образом скорректировать хранилище для контекстных данных отмены).

+0

Я думаю, что цель вопроса состояла в том, чтобы выяснить, как сохранить аргументы NSInvocation, а не цель. Вы правильно относитесь к циклу удержания цели, но я не вижу, как сохранить аргументы для создания цикла. –

0

Хотя ответ, который был дан, является правильным относительно цели, ответ в отношении аргументов таков: им не нужно сохранять их, потому что это делает менеджер отмены. См. Does NSUndoManager retain its arguments?

Смежные вопросы