Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

enter image description here

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 [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];
}
like image 963
Ravi shankar Avatar asked May 23 '11 10:05

Ravi shankar


1 Answers

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];
}
like image 128
deoKasuhal Avatar answered Oct 20 '22 02:10

deoKasuhal