是drawRect----泄漏内存

Posted

技术标签:

【中文标题】是drawRect----泄漏内存【英文标题】:Is drawRect ---- leaking memory 【发布时间】:2012-01-19 12:56:49 【问题描述】:

我目前看到内存泄漏的问题,它似乎来自以下代码:

- (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];


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

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

【问题讨论】:

这里没有泄漏,因为您释放了所有内容。你有另一个问题,在另一个地方。 "我目前看到内存泄漏问题";什么工具向您显示这些泄漏?用于查找内存泄漏的第一个工具是分析器。 (在Xcode菜单栏Product->Analyze) 当然,这些工具没有显示泄漏,但在这段代码中,我正在移动并传递整个图像.....我确定有问题......:(但我需要这段代码显示了绘制的内容... 但我的问题是是否有可能以不同的方式做同样的事情??? 至少有一种稍微不同的方法可以在 drawRect 中绘制位图,至少还有两种方法可以在使用 drawRect 之外显示位图。但这不是你的问题标题。 【参考方案1】:

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

【讨论】:

你绝对是对的,但是当我在 iPad 上运行这个 API 时,一切都很好,直到我在 iPhone 上运行它.....现在我修复了所有泄漏问题,但 iPhone 上的 Api 仍然非常好慢.....【参考方案2】:

鉴于此信息,我能想象的唯一可能的泄漏可能与 offScreenBuffer 有关。 如果您显示更多代码或仪器跟踪,它可能有助于发现问题。

还给出了内存泄漏的“大小”,您可以查看它是泄漏的图像还是其他原因,您误读了仪器报告。

【讨论】:

当然,但它只有 CGContextRef *offScreenBuffer 用于显示我之前绘制的图像....:( 好的,仍然要确保你正确地释放它。顺便问一下,你为什么不搬到 ARC? 这怎么可能是个问题?使用 ARC?或进行适当的内存管理?顺便说一句,许多类型的动画可以使用核心动画设施或 ios 内置的其他设施来完成。如果您还没有,请不要重新发明***。 但是arc还是没有解决iPhone上API变慢的问题..:( 当然,但我解决了绘画=)但是谢谢,但我不想重建超过一个月的工作:(【参考方案3】:

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

【讨论】:

以上是关于是drawRect----泄漏内存的主要内容,如果未能解决你的问题,请参考以下文章

iPad上的drawRect导致内存问题

内存恶鬼drawRect

空drawRect实现导致内存警告

drawrect 在非常大的 uiview 和内存不足

为啥尝试使用 drawRect 绘制彩色圆圈时颜色是透明的?

little tips of painter.drawRect in Qt