【问题标题】:Dramatically increase the memory when adding transparent view as a subview添加透明视图作为子视图时显着增加内存
【发布时间】:2014-02-27 13:55:09
【问题描述】:

我的视图层次结构,

UIScrollView
      UIImageView
叠加视图

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:

如果我将视图层次结构更改为下面(覆盖视图是 UIImageView 的子视图而不是滚动视图),那么消耗的内存比上面提到的层次结构要少得多。甚至我可以说内存问题完全解决了。

UIScrollView
      UIImageView
叠加视图

Still curious to know why this is happening?

【问题讨论】:

  • 如果您使用的是模拟器,请在真机上进行测试,然后检查内存消耗。模拟器内存​​消耗的行为与设备上的不同。
  • 你在哪里检查这个内存使用情况? Instruments 或 Xcode(在 Xcode 5 中,Debug Navigator 下显示了内存使用情况)。如果是 Xcode,那么它不会正确显示内存使用情况。检查仪器。
  • 我正在设备中进行测试。并使用“分配”工具
  • 视图的大小在这里应该不是问题,它很可能是代码中发生的事情。当您说“该视图的目的是徒手绘图”时,您的意思是您实际上是在某个时刻将叠加视图渲染为图像吗?也许如果您发布一些代码,您可能会得到更多有用的答案
  • @lxt: 看我用我的观察更新了这个问题

标签: ios memory-management


【解决方案1】:

这个内存问题只是因为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 因此,overlay 消耗的内存为:(4000*3000*2*2*4) (即这个计算是根据上面的公式。)在 Mb 中它变成了大约 183Mb

现在将此视图添加到 imageview 可以解决此问题,因为该图像视图是滚动视图正在缩放的​​视图。因此,显然在任意数量的缩放比例下,覆盖视图的大小都将是固定的,但它将根据缩放比例进行缩放。

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2014-11-16
    相关资源
    最近更新 更多