【问题标题】:Performance of UIView: removeFromSuperview VS hideUIView 的性能:removeFromSuperview VS hide
【发布时间】:2012-07-04 22:37:21
【问题描述】:

这个问题真的很基础。从视图层次结构中删除 UIView 和隐藏 UIView 之间的性能差异是什么?

我已经读到应该从视图层次结构中删除不需要的视图。我目前的情况是 UIButton 有时应该是可见的。我什么时候隐藏UIButton,什么时候从它的超级视图中删除它?

更改视图层次结构是否昂贵?

【问题讨论】:

    标签: ios uiview subview


    【解决方案1】:

    最初的问题和(正确)接受的答案之间已经过去了几年。让我补充另一个因素:与此同时,Apple 引入了 AutoLayout,正如有人所说,它可能会在某些(深层)子视图层次结构中带来相当大的性能损失。

    如果您使用 AutoLayout,则隐藏的视图仍会进行布局,而不是已删除的视图(其引用保存在某处)。根据您的情况,这可能会产生性能差异。

    【讨论】:

      【解决方案2】:

      我在 iOS6 iPad mini 上做了一个实验,有一个大滚动视图,里面有很多丰富的内容(包括图像、阴影、渐变层、带图案的背景图像,你知道的,那些设计师:))和我发现view.hidden=YES≠[view removeFromSuperview]。

      我原本以为将 hidden 设置为 YES 会使视图不被渲染/绘制,因此隐藏的视图很多不会影响效率。但实际结果是: 1)如果我将大滚动视图中的屏幕外视图设置为隐藏(并在它们返回可见区域时取消隐藏它们),滚动根本不平滑/连续。当它自然减速时,它看起来非常跳跃。 2)如果我从滚动视图中删除屏幕外视图(但仍然通过跟踪数组保留在内存中,因此当它们返回时可以立即添加),滚动显然更平滑。

      【讨论】:

      • 这实际上对我来说重申了这样一个事实,即将 UIView 设置为“隐藏”可以使其免于呈现并可能以某种方式提高性能。当然,跳跃性来自于使其“不隐藏”,这可能会强制 setNeedsDisplay 和 setNeedsLayout 一起使用(不确定后者),这会导致速度变慢。对于 tableview,这可能是个坏主意,但对于“在”其他视图“后面”的更大视图,隐藏它可能是个好主意,这样它就不会在不需要时触发不必要的重绘。
      • "2) 如果我从滚动视图中删除屏幕外视图(但仍然使用跟踪数组保存在内存中,因此当它们返回时可以立即添加),滚动显然更平滑. "你能举一个简短的例子吗?听起来像是处理屏幕外视图的好方法(内存和性能方面)。
      【解决方案3】:

      如果您需要在显示和隐藏子视图之间交替显示,最好的方法肯定是隐藏它。对于UIButton,内存影响无论如何都不是那么好。如果只是切换hidden 属性,代码肯定会更简单。

      此外,您还可以获得hidden 属性是可动画的额外优势!

      【讨论】:

      • 那么渲染隐藏的 UIView 和在视图层次结构中没有该视图有什么区别?有区别吗?
      • 是的。如果它已被删除,您基本上是从头开始重新创建它。这可能有利于内存管理,但可能不利于性能,而且由于您无法对更改进行动画处理,因此效果不佳。
      • 好吧,如果您保留对视图的引用,则不必重新创建它。我对更改视图层次结构的开销很感兴趣。这种改变会触发什么。我想它基本上改变了 UIKit 作为视图层次结构的表示来管理的树结构。你认为这准确吗?
      • 更正您对参考的说法。我认为隐藏的方法更有效,这正是你所说的原因。但是您必须创建一个相当庞大的测试场景才能感受到这种差异。 (例如,很多表格视图单元格滚动得非常快......)
      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      相关资源
      最近更新 更多