Проблема группировки NSUndoManager? - PullRequest
0 голосов
/ 01 апреля 2010

Я работаю над графическим приложением. Я пытаюсь реализовать возможность отмены / повтора, поэтому я сообщаю отменить просмотр приложения представлению, чтобы сохранить текущее изображение перед обновлением дисплея. Это работает отлично (да, я понимаю, что перерисовка / сохранение всего представления не невероятно эффективно, но для решения этой проблемы, прежде чем пытаться оптимизировать код). Однако, как и ожидалось, когда я «отменяю» или «повторяю», отражается только незначительное изменение. Моя цель - отменить / переделать весь ход пальца. Для этого я сказал undoManager [beginUndoGrouping] в методе [touchesBegan] и [endUndoGrouping] в [touchesEnded]. Это работает немного, но после рисования нескольких штрихов приложение вылетает, и GDB завершается с exc_bad_access. согласно сообщениям о сбое, это связано с нехваткой памяти

Я очень благодарен за любые идеи, которые вы мне можете дать.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

mouseDragged = YES;

currentPoint = [[touches anyObject] locationInView:self];

UIGraphicsBeginImageContext(drawingImageView.bounds.size);
[drawingImageView.image drawInRect:drawingImageView.bounds];

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineCap(ctx, kCGLineCapRound);
CGContextSetLineWidth(ctx, drawingWidth);
[drawingColor setStroke];

CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, previousPoint.x, previousPoint.y);
CGContextAddLineToPoint(ctx, currentPoint.x, currentPoint.y);
CGContextStrokePath(ctx);

[self.undoManager registerUndoWithTarget:drawingImageView selector:@selector(setImage:) object:drawingImageView.image];
drawingImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
previousPoint = currentPoint;

}

1 Ответ

2 голосов
/ 02 апреля 2010

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

Группировка отмены может все еще работать для вас, но вы можете вместо этого сохранить эти нарисованные точки, используя что-то вроде -addPoint:, с методом -removePoint: в качестве действия отмены. Сохранение самих точек потребует гораздо меньше памяти, чем сохранение изображений.

Однако, если вы перерисовываете изображение с каждой точкой касания, ваше действие по отмене может занять некоторое время, поскольку оно перерисовывает представление для каждой точки на нарисованной трассе. Вы можете просто отказаться от группировки отмен и просто зарегистрировать действие отмены для удаления всех точек одновременно в методах завершенных / отмененных касаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...