是drawRect ----泄漏内存

时间:2012-01-19 12:56:49

标签: ios uiview memory-leaks uiimage drawrect

我目前看到内存泄漏问题,似乎来自这段代码:

- (void)drawRect:(CGRect)rect
{

    CGImageRef cgImage = CGBitmapContextCreateImage(offScreenBuffer);
    UIImage *uiImage = [[UIImage alloc] initWithCGImage:cgImage];

    CGImageRelease(cgImage);

    [uiImage drawInRect:self.bounds];
    [uiImage release];

}

从触摸事件中调用此方法......

-(void)drawPoint:(UITouch *)touch {  

    currentLoc = [[PointLocation alloc] init];

    currentLoc.location = [touch locationInView:self];

    self.previousPoint = self.point;

    self.point = currentLoc;
    [self drawToBuffer];

    [currentLoc release];

}

这是缓冲......

-(void)drawToBuffer {


    CGFloat color[4] = {R,G,B,A};

    if (self.previousPoint != nil) {
    CGContextSetRGBStrokeColor(offScreenBuffer, color[0],color[1],color[2],color[3]);

    CGContextBeginPath(offScreenBuffer);
    CGContextSetLineWidth(offScreenBuffer, lane);
    CGContextSetLineCap(offScreenBuffer, kCGLineCapRound);

    CGContextMoveToPoint(offScreenBuffer, previousPoint.location.x, previousPoint.location.y);
    CGContextAddLineToPoint(offScreenBuffer, point.location.x, point.location.y);

    CGContextDrawPath(offScreenBuffer, kCGPathStroke);

}
 [self setNeedsDisplay];

}

这真的很慢...... :(我不知道为什么......

每次我在所选视图中绘制时,都会调用它,但每次我需要创建一个图像并在屏幕上显示它。是否有可能以另一种方式做到这一点??

3 个答案:

答案 0 :(得分:0)

根据这些信息,我能想象的唯一可能泄漏可能与offScreenBuffer有关 如果您显示更多代码或仪器跟踪,它可能有助于找到问题。

同样考虑到内存泄漏的“大小”,您可以看到它是否是泄漏的图像或其他内容并且您误读了仪器报告。

答案 1 :(得分:0)

drawRect中的发布代码不应显示任何泄漏,因为图像已正确释放。

答案 2 :(得分:0)

我目前解决了这个问题。这是一个将数据存储器再次保存为定义大小的图像的问题。我需要从头开始创建一个绘图api,花了一些时间,但它比更新无功能版本更好。谢谢大家的合作=)