2010-04-01 5 views
0

저는 베어 본 드로잉 앱을 만들고 있습니다. 실행 취소/다시 실행 기능을 구현하려고 시도하므로 표시를 업데이트하기 전에 현재 이미지를 저장하도록 뷰의 undoManager에 알립니다. 이것은 완벽하게 작동합니다 (예, 전체보기 다시 그리기/저장이 매우 효율적이지는 않지만 코드 최적화를 시도하기 전에이 문제를 해결할 수 있음을 알고 있습니다). 그러나 예상대로 '실행 취소'또는 '다시 실행'을 수행하면 미세한 변경 사항 만 반영됩니다. 내 목표는 전체 손가락 스트로크를 실행 취소하거나 다시 실행하는 것입니다. 그렇게하기 위해 undoManager에 [touchesBegan] 메소드의 [beginUndoGrouping] 및 [touchesEnded]의 [endUndoGrouping]에 대해 설명했습니다. 그건 조금은 효과가 있지만 몇 스트로크를 그린 후에 앱이 충돌하고 gdb가 exc_bad_access로 종료됩니다. 오류보고에 따르면, 메모리 부족으로 인한 것입니다.NSUndoManager 그룹화 문제가 있습니까?

저에게 제공 할 수있는 통찰력에 대해 매우 감사드립니다.

- (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; 

} 당신이 저장하고 이미지로 전체보기를로드하는 문제를 해결하고 싶지 않을 수도 있지만

답변

2

는, 나는 여기에 응용 프로그램 충돌 무슨입니다 확신 해요. 사용자의 손가락이 움직일 때마다 또 다른 이미지를 생성하여 실행 취소 스택에 추가합니다. 실행 취소/다시 실행 작업을 사용하여 그룹화를 사용하더라도 아무리 많은 메모리 집약적 이미지가 쌓여있어 어느 시점에서 응용 프로그램의 메모리가 부족합니다.

실행 취소 그룹화는 계속 사용할 수 있지만 실행 취소 작업으로 -addPoint:과 같은 -removePoint: 메서드를 사용하여 이러한 그려지는 점을 대신 저장할 수 있습니다. 포인트 자체를 저장하면 이미지를 저장하는 것보다 훨씬 메모리 집약적입니다.

그러나 각 터치 포인트로 이미지를 다시 그릴 경우 실행 취소 작업은 그려진 트레이스의 각 포인트에 대해 뷰를 다시 그리는 동안 실행하는 데 시간이 걸릴 수 있습니다. 실행 취소 그룹을 그냥 버리고 종료/취소 된 메소드에서 한 번에 모든 포인트를 제거하기위한 실행 취소 작업을 등록하기 만하면됩니다.