UIScrollView似乎在大ContentSize上使用了大量内存

时间:2010-07-02 01:27:22

标签: iphone cocoa-touch memory ipad uiscrollview

我创建了一个UIScrollView(canvas.scrollview),里面有一个自定义的UIView(画布)。

启动的正常配置是这样的:

CGRect cs2 = CGRectMake(0,0,4000,4000);  CGPoint screen = {[UIScreen mainScreen] .bounds.size.width,[UIScreen mainScreen] .bounds.size.height};

self.canvas.frame = cs2; // canvas_size;

self.canvas.scrollView.contentSize = canvas_size.size;  self.canvas.scrollView.contentOffset = CGPointMake(canvas_size.size.width / 2-screen.x / 2,                 canvas_size.size.height / 2-screen.y / 2);

但是我注意到当我将scrollview内容大小设置为更大的值,例如4000,4000;它将使用更多的内存。例如:

scrollview   view  real virtual
1000,1000 1000,1000 6  88
4000,4000 1000,1000 62  145
1000,1000 4000,4000 6  88

如果可能的话,我希望有一个相当大的工作区域,但8000x8000可以完全消耗内存。知道为什么scrollview会耗尽这么多内存,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

我不认为滚动视图占用了这么多内存,而是画布自定义UIView子类。如果canvas真的是4000 x 4000,那么系统必须分配足够的内存来容纳该大小的32位深位图,或大约64 MB。对于如此大的视图,您应该将CATiledLayer用于静态内容或某种平铺视图系统。

答案 1 :(得分:1)

我在当前项目中使用巨大的滚动视图(成千上万像素),这对我来说绝对不会发生。我认为你的UIView可能是巨大的问题,而不是你的滚动视图。尝试将UIView的大小设置为768x1024,然后将滚动视图设置为4k x 4k并查看问题是否消失。

如果UIView碰巧是图像(我怀疑它,或者您可能会提到它),您应该知道iOS仅支持最大1024x1024的图像,之后会有一些在内存使用方面的“未定义行为”。您可能需要查看CATiledLayer,尽管没有内容的普通UIView不管它有多大都不会占用太多内存,所以在您的项目中也可能存在其他问题。