是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----泄漏内存的主要内容,如果未能解决你的问题,请参考以下文章