当ScrollView太大时会耗尽内存

时间:2010-11-25 20:45:36

标签: iphone objective-c cocoa-touch uikit

我有一个应用程序,它为用户提供某种线图。我正在使用UIScrollView,其中包含带有图形的视图。该视图使用CoreGraphics以其绘制的方法绘制图形。 当图表太长时会出现问题。滚动图表似乎口吃,最终应用程序将耗尽内存并退出。看看其他应用程序,我看到创建WeightBot应用程序的人能够毫无问题地管理长时间运行的图表,所以显然我做错了。

我想知道如何创建这种长线图而不会遇到内存问题?

编辑:添加一些代码

基本上我所做的就是初始化视图,在它的drawRect方法中构建图形,并将视图作为子视图添加到scrollView。

这是视图的drawRect的实现方式:

- (void)drawRect:(CGRect)rect 
{
CGContextRef c = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(c, self.backgroundColor.CGColor);
CGContextFillRect(c, rect);

//... do some initialization 

 for (NSUInteger i = 0; i < xValuesCount; i++) 
    {
        NSUInteger x = (i * step) * stepX;

        NSUInteger index = i * step;

        CGPoint startPoint = CGPointMake(x + offsetX, offsetY);
        CGPoint endPoint = CGPointMake(x + offsetX, self.frame.size.height - offsetY);

        CGContextMoveToPoint(c, startPoint.x, startPoint.y);
        CGContextAddLineToPoint(c, endPoint.x, endPoint.y);
        CGContextClosePath(c);

        CGContextSetStrokeColorWithColor(c, self.gridXColor.CGColor);
        CGContextStrokePath(c);
    }
}

3 个答案:

答案 0 :(得分:1)

大视图(使用绘制方法)占用大量内存,即使其超级视图很小。你超大的子视图需要一个巨大的后备缓冲区。

相反,只需直接从uiscrollingview子类化。滚动视图仅与其视觉部分一样大。绘图时会自动处理偏移。你的绘制方法将一直被调用,但这应该没问题。

答案 1 :(得分:1)

rect的{​​{1}}参数表示您要查看的视图的哪个部分。你应该添加一些逻辑来计算你的图形的哪些部分在那个矩形中并且只绘制那些部分,而不是在每次调用时重绘整个部分。

答案 2 :(得分:0)

弄清楚数据集的哪个部分是可见的,只绘制您需要的部分。