将透明视图添加为子视图时,会显着增加内存

时间:2014-02-27 13:55:09

标签: ios memory-management

我的视图层次结构,

  

UIScrollView
UIImageView
    OverlayView的

OverlayView是一个透明视图,该视图的目的是徒手绘图。

我采用的OverlayView与UIImageView的大小相同。

让我用示例和一些数据解释一下我的内容,

UIScrollView处于缩放比例:5和UIImageView is of Size: 4000*3000(即实际上UIImageview处于缩放状态。)在此级别,内存消耗为50Mb。

每当我添加此OverlayView时,内存增加200Mb。不确定为什么内存会急剧增加。

当我开始在覆盖视图上移动我的手指进行徒手绘图时,在3或5秒钟内,消耗量达到630Mb左右。

这是因为UIView的大小问题吗?

What is the easiest solution to fix this issue?

如果这个问题只是因为大小那么一个解决方案可以我可以看到只有可见的大小不是UIImageView的大小但是我不喜欢这个因为我需要做很多转换点到获得所需的积分。

Update:

如果我将视图层次结构更改为下面(Overlay视图是UIImageView的子视图而不是scrollview),则会消耗大量的内存,然后是上面提到的层次结构。甚至我可以说记忆问题已经彻底解决了。

  

UIScrollView
UIImageView
    OverlayView的

Still curious to know why this is happening?

1 个答案:

答案 0 :(得分:0)

此内存问题仅仅是因为UIView的大小。

我从堆栈溢出中得到一个链接:Drawing a grid in UIScrollView's subview allocates huge memory

如果任何视图覆盖DrawRect方法将消耗内存,那么答案就是清除:

bound.size.width * bound.size.height*contentScale*contentScale*4

正如我在添加叠加内存之前所述的那样,内存消耗为50Mb。添加叠加后,它变成大约200Mb。

覆盖层尺寸为:4000 * 3000 因此,叠加所消耗的内存将是:(4000 * 3000 * 2 * 2 * 4)(即此计算符合上述公式。)在Mb中它变为大约183Mb

现在将此视图添加到imageview可以解决此问题,因为该图像视图是由scrollview缩放的视图。因此,显然在任何数量的缩放比例大小的叠加视图将被修复,但它将根据缩放比例缩放。