开发者

Iphone application performance is slowing down with out any memory leak?

开发者 https://www.devze.com 2023-03-07 14:25 出处:网络
I have a IPhone drawing application which is slowing down when I use the spray can tool. But when I check for leaks by running the application with leaks no leaks are shown. All other tools are workin

I have a IPhone drawing application which is slowing down when I use the spray can tool. But when I check for leaks by running the application with leaks no leaks are shown. All other tools are working fine can some help me out in resolving this issue.

Iphone application performance is slowing down with out any memory leak?

My Spray can tools class code is as following:

    - 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开发者_StackOverflow中文版 [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];
}


define the properties in the h block and synthesize in the m block.

@property (nonatomic, retain) NSMutableArray *trackingTouches;
@property (nonatomic, retain) NSMutableArray *startPoints;
@property (nonatomic, retain) NSMutableArray *paths;

@synthesize trackingTouches,startPoints,paths;

and use the dealloc block like this

    - (void)dealloc {
         [self setTrackingTouches:nil]; 
     [self setStartPoints:nil];
     [self setPaths:nil];
     self.delegate = nil;
         [super dealloc];
}


don't use UIBezierPath. create a CGMutablePathRef instead with the plain Core Graphics functions.

0

精彩评论

暂无评论...
验证码 换一张
取 消