NSUndoManager сохраняет объекты? - PullRequest
0 голосов
/ 23 ноября 2010

Я делаю следующее:

    Path2D *pathToRemove = [path copy];
    [[[self undoManager] prepareWithInvocationTarget:self] removePath:pathToRemove atIndex:index];
[pathToRemove autorelease];

У меня также есть кнопка очистки, которая делает:

[undoManager removeAllActions];

Проблема в том, что removeAllActions вылетает в приложение. Когда я удалил [pathToRemove autorelease], он работал (или, по крайней мере, не падал. Это все еще может быть утечка памяти). Я предполагаю, что предположил, что undoManager сохранил pathToRemove при передаче в вызове prepareWithInvocationTarget.

Разве это не так? Если это не так, то сбой может произойти, потому что вызов removeAllActions освобождает объект PathToRemove. Но это будет означать, что это ошибка в NSUndoManager, которая крайне маловероятна.

Я могу сказать, что моя реализация copyWithZone, скорее всего, также не является виновником, поскольку выходные данные NSLog для '[pathToRemove description]' и '[path description]' показывают разные адреса, как и ожидалось.

Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Согласно документации, метод prepareWithInvocationTarget: не сохраняет переданные ему аргументы.Из документации NSUndoManager видно, что она просто захватывает NSInvocation и позже воспроизводит его.NSInvocation объекты не сохраняют объекты в своих аргументах, если их специально не попросят сделать это.

Это не совсем объясняет сбой, поскольку removeAllActions просто должен очистить стек отмены и не выполнятьчто-нибудь к объектам.

Надеюсь, что это поможет некоторым в отслеживании источника аварии.

0 голосов
/ 27 июля 2011

По моему опыту, это не проблема выпуска / сохранения.Вы должны очистить стек после операции Undo / Redo.Для этого вы можете зарегистрировать свой viewController для уведомления NSUndoManagerDidUndoChangeNotification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearUndoRedoStack) name:NSUndoManagerDidUndoChangeNotification object:nil];

, а затем очистить стек указанным методом:

- (void)clearUndoRedoStack {
    [undoManager removeAllActions];
}
...