NSUndoManager分组问题?

时间:2010-04-01 19:00:20

标签: iphone objective-c gdb

我正在制作一个准确的绘图应用程序。我正在尝试实现撤消/重做功能,所以我告诉视图的undoManager在更新显示之前保存当前图像。这非常有效(是的,我知道重绘/保存整个视图并不是非常有效,而是在尝试优化代码之前解决这个问题)。然而,正如预期的那样,当我'撤消'或'重做'时,只反映了微小的变化。我的目标是让整个手指中风/重做。为此,我在[touchesBegan]方法中将undoManager告诉[beginUndoGrouping],并在[touchesEnded]中告诉[endUndoGrouping]。这有点作用,但在绘制了几个笔画后,应用程序崩溃了,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 个答案:

答案 0 :(得分:2)

即使您可能不想解决将整个视图保存并加载为图像的问题,但我很确定这会使您的应用程序崩溃。每次用户的手指移动时,您都会生成另一个图像并将其添加到撤消堆栈。无论你是否使用撤消/重做动作进行分组,你都会在那里堆积大量内存密集型图像,​​并且你的应用程序在某些时候会耗尽内存。

撤消分组仍然可以为您工作,但您可能希望使用-addPoint:之类的方法来存储这些绘制的点,并使用-removePoint:方法作为撤消操作。与保存图像相比,存储点本身的内存密集程度要小得多。

但是,如果您使用每个触摸点重新绘制图像,则撤消操作可能需要一段时间才能运行,因为它会重绘绘制轨迹中每个点的视图。您可能只想放弃撤消分组,只需注册撤消操作即可在触摸结束/取消方法中一次删除所有点。