首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSUndoManager分组问题?

NSUndoManager分组问题?
EN

Stack Overflow用户
提问于 2010-04-02 03:00:20
回答 1查看 476关注 0票数 0

我正在开发一个基本的绘图应用程序。我正在尝试实现undo/redo功能,所以我告诉视图的undoManager在更新显示之前保存当前图像。这可以完美地工作(是的,我知道重新绘制/保存整个视图并不是非常有效,但在尝试优化代码之前要解决这个问题)。然而,正如预期的那样,当我“撤销”或“重做”时,只反映了微小的变化。我的目标是取消/重做整个手指笔划。为此,我告诉undoManager在touchesBegan方法中使用beginUndoGrouping,在touchesEnded中使用endUndoGrouping。这在一定程度上是可行的,但在绘制了几个笔划之后,应用程序崩溃,gdb退出,并显示exc_bad_access。根据坠机报告,这是由于内存不足

我非常感谢你能给我的任何见解。

代码语言:javascript
复制
- (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;

}

EN

回答 1

Stack Overflow用户

发布于 2010-04-03 01:49:09

尽管您可能不想解决将整个视图作为图像保存和加载的问题,但我非常确定这就是导致您的应用程序崩溃的原因。每次用户的手指移动时,您都会生成另一个图像并将其添加到撤消堆栈中。无论您是否将分组与undo / redo操作一起使用,您都会在那里堆积大量占用内存的图像,并且您的应用程序将在某些时候耗尽内存。

撤消分组仍然适用于您,但是您可能希望使用类似于-addPoint:的方式存储这些绘制点,并使用-removePoint:方法作为撤消操作。存储点本身将比保存图像占用的内存少得多。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2562883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档