【问题标题】:Is drawRect ---- leaking memory是drawRect----泄漏内存
【发布时间】: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 之外显示位图。但这不是你的问题标题。

标签: ios uiview memory-leaks uiimage drawrect


【解决方案1】:

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

【讨论】:

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

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2020-07-22
    • 2010-10-13
    • 2011-02-20
    • 2019-01-28
    相关资源
    最近更新 更多