2010-11-23 2 views
0

я сделать следующее:Сохраняет ли NSUndoManager объекты?

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

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

[undoManager removeAllActions]; 

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

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

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

Любая помощь будет оценена по достоинству. Благодарю.

+0

хорошо я понял это. «prepareWithInvokationTarget» ДОЛЖЕН сохранить свои аргументы. Моя проблема заключалась в том, что мой метод copyWithZone действительно был неправильным. У меня был объект, который не копировался и сохранялся только. Таким образом, когда «RemoveAllActions» выпустили объекты, и они вошли в их соответствующие методы Dealloc, выпуск этой переменной-члена, которая не была «скопирована», создала сценарий с двойной версией, что привело к сбою. Еще раз спасибо! – user482393 2010-11-23 07:08:34

ответ

2

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

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

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

+0

Спасибо. Я попытаюсь использовать: registerUndoWithTarget: selector: object. Согласно документу, это сохраняет объект, поэтому я могу его освободить после вызова этого метода регистрации. – user482393 2010-11-23 05:53:54

0

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

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

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

- (void)clearUndoRedoStack { 
    [undoManager removeAllActions]; 
} 
Смежные вопросы