ios4 - iPhone应用程序性能下降但没有任何内存泄漏?

标签 ios4 drawing bezier nsbezierpath

我的 iPhone 绘图应用程序在使用喷雾 jar 工具时速度变慢。但是,当我通过运行有泄漏的应用程序来检查泄漏时,没有显示泄漏。所有其他工具都工作正常,可以帮助我解决这个问题。

enter image description here

我的喷雾 jar 工具类代码如下:

    - 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 block 中定义属性并在m block 中综合。 <br/><br/> @property (nonatomic, retain) NSMutableArray *trackingTouches;<br/> @property (nonatomic, retain) NSMutableArray *startPoints; <br/> @property (nonatomic, retain) NSMutableArray *paths;<br/>

@synthesize trackingTouches,startPoints,paths;<br/>

并像这样使用 dealloc block

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

关于ios4 - iPhone应用程序性能下降但没有任何内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6095901/

相关文章:

java - 在有限空间内绘制坡度线

c# - 不同的内置图像抽象的优点是什么?

Python Turtle 用正方形绘制圆形

3d - 贝塞尔三次曲线 : moving with uniform acceleration

javascript - 绘制贝塞尔曲线但 Canvas 保持空白

math - 如何找到两条三次贝塞尔曲线之间的交点

iphone - 如何在iPhone中使用CATextLayer设置视频中的文本位置?

iphone - Objective-C Expected Identifier - 简单语法调试问题

iphone - 在 iOS 4 中使用 Storyboard和 ARC

iphone - 非法改变 NSFetchedResultsController 的获取请求