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

Posted

技术标签:

【中文标题】UIScrollView 似乎在大 ContentSizes 上使用了大量内存【英文标题】:UIScrollView seems to use a lot of memory on big ContentSizes 【发布时间】:2010-07-02 01:27:21 【问题描述】:

我创建了一个 UIScrollView (canvas.scrollview) 并在其中有一个自定义 UIView (canvas)。

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

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);

但我注意到,当我将滚动视图内容大小设置为更大的值时,例如 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 完全占用了内存。知道为什么滚动视图会占用这么多内存,有没有办法解决这个问题?

【问题讨论】:

UIScrollView 的 contentSize 不影响内存使用。 如果是这样,那为什么只有当我改变 contentSize 时它才会改变? 【参考方案1】:

我在当前项目中使用了巨大的滚动视图(数千乘以千像素),这绝对不会发生在我身上。我认为您的UIView 很大可能是问题所在,而不是您的滚动视图。尝试将UIView 的大小设置为 768x1024,然后将滚动视图设置为 4k x 4k,看看问题是否消失。

如果UIView 恰好是图像(我对此表示怀疑,或者您可能会提到它),您应该知道 ios 仅支持最大 1024x1024 大小的图像,之后会有一点“未定义的行为”在内存使用方面。您可能需要查看CATiledLayer,尽管没有内容的普通 UIView 不应该占用那么多内存,无论它有多大,因此您项目的其他地方也可能存在问题。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于UIScrollView 似乎在大 ContentSizes 上使用了大量内存的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView的contentSize、contentOffset和contentInset的理解

解决UIScrollView中添加子控件出现“UIScrollView Scrollable Content Size Ambiguity”的办法

更改 UIScrollVIew Content Inset 触发 scrollViewDidScroll

contentInsetAdjustmentBehavior 似乎不适用于子 UIControllerView 的 UIScrollview

将 UIScrollView 添加到表格单元格似乎会影响表格滚动性能

小 div在大 div中左右上下居中