我有一个iPhone绘图应用程序,当我使用喷雾罐工具时速度变慢。但是当我通过运行泄漏应用程序来检查泄漏时,没有泄漏。所有其他工具都运行正常可以帮助我解决这个问题。
我的Spray工具类代码如下:
- init {
if ((self = [super init]))
{
trackingTouches = [[NSMutableArray array] retain];
startPoints = [[NSMutableArray array] retain];
paths = [[NSMutableArray array] retain];
}
return self;
}
- (void)activate { } - (void)deactivate {
[trackingTouches removeAllObjects];
[startPoints removeAllObjects];
[paths removeAllObjects];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// UIView *touchedView = [delegate viewForUseWithTool:self];
UITouch *theTouch = [touches anyObject];
UIView *touchedView = [delegate viewForUseWithTool:self];
endPoint = [theTouch locationInView:touchedView];
for (UITouch *touch in [event allTouches]) {
// CGFloat lineWidth=10;
// remember the touch, and its original start point, for future
[trackingTouches addObject:touch];
CGPoint location = [touch locationInView:touchedView];
[startPoints addObject:[NSValue valueWithCGPoint:location]];
UIBezierPath *path = [UIBezierPath bezierPath];
path.lineCapStyle = kCGLineCapRound;
[path moveToPoint:location];
[path setLineWidth:delegate.strokeWidth];
[path addLineToPoint:location];
[paths addObject:path];
}
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self deactivate];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
// UITouch *theTouch = [touches anyObject];
// UIView *touchedView = [delegate viewForUseWithTool:self];
//endPoint = [theTouch locationInView:touchedView];
for (UITouch *touch in [event allTouches])
{ // make a line from the start point to the current point
NSUInteger touchIndex = [trackingTouches indexOfObject:touch];
// only if we actually remember the start of this touch...
if (touchIndex != NSNotFound) {
UIBezierPath *path = [paths objectAtIndex:touchIndex];
PathDrawingInfo *info = [PathDrawingInfo pathDrawingInfoWithPath:path fillColor:[UIColor clearColor] strokeColor:delegate.strokeColor];
[delegate addDrawable:info];
[trackingTouches removeObjectAtIndex:touchIndex];
[startPoints removeObjectAtIndex:touchIndex];
[paths removeObjectAtIndex:touchIndex];
}
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
// UIView *touchedView = [delegate viewForUseWithTool:self];
UITouch *theTouch = [touches anyObject];
UIView *touchedView = [delegate viewForUseWithTool:self];
currentpoint = [theTouch locationInView:touchedView];
//currentpoint.y -=20;
//[self drawCircle];
for (UITouch *touch in [event allTouches]) {
CGFloat lineWidth=10;
// make a line from the start point to the current point
NSUInteger touchIndex = [trackingTouches indexOfObject:touch];
UIBezierPath *path = [UIBezierPath bezierPath];
if (touchIndex != NSNotFound) {
// CGPoint location = [touch locationInView:touchedView];
UIBezierPath *path = [paths objectAtIndex:touchIndex]; UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:CGRectMake((currentpoint.x-lineWidth),( currentpoint.y-lineWidth), lineWidth*2, lineWidth*2)];
NSInteger i,x,y;
NSInteger modNumber =5*(int)lineWidth;
for (i = 0; i < (lineWidth*lineWidth)/2; i++) {
do {
x = (random() % modNumber)+currentpoint.x - lineWidth*2;
y = (random() % modNumber)+currentpoint.y - lineWidth*2;
} while (![circle containsPoint:CGPointMake(x,y)]);
[path appendPath:[UIBezierPath bezierPathWithRect:CGRectMake(x,y,0.0025,0.0025)]];
}
[path moveToPoint:currentpoint];
[path setLineWidth:delegate.strokeWidth];
[path addLineToPoint:currentpoint];
// only if we actually remember the start of this touch...
}
[paths addObject:path];;
}
}
- (void)drawTemporary {
for (UIBezierPath *path in paths) {
[delegate.strokeColor setStroke];
[path stroke];
}
}
- (void)dealloc {
[trackingTouches release];
trackingTouches = nil;
[startPoints release];
startPoints = nil;
[paths release];
paths = nil;
self.delegate = nil;
[super dealloc];
}
答案 0 :(得分:1)
定义h块中的属性并在m块中合成。
@property (nonatomic, retain) NSMutableArray *trackingTouches;
@property (nonatomic, retain) NSMutableArray *startPoints;
@property (nonatomic, retain) NSMutableArray *paths;
@synthesize trackingTouches,startPoints,paths;
并像这样使用dealloc块
- (void)dealloc {
[self setTrackingTouches:nil];
[self setStartPoints:nil];
[self setPaths:nil];
self.delegate = nil;
[super dealloc];
}
答案 1 :(得分:0)
不要使用UIBezierPath。使用普通的Core Graphics函数创建一个CGMutablePathRef。