问题描述
|
我有一个iPhone绘图应用程序,当我使用喷雾罐工具时,它的运行速度在减慢。但是,当我通过运行带有泄漏的应用程序来检查泄漏时,没有显示泄漏。所有其他工具都可以正常工作,可以帮助我解决该问题。
我的喷雾罐工具类代码如下:
- 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];
}
解决方法
在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];
}
,不要使用UIBezierPath。用普通的Core Graphics函数创建一个CGMutablePathRef。