Ios UIView的性能:removeFromSuperview VS hide

Ios UIView的性能:removeFromSuperview VS hide,ios,uiview,subview,Ios,Uiview,Subview,这个问题很基本。从视图层次结构中删除UIView和隐藏UIView之间的性能差异是什么 我已经读到,不需要的视图应该从视图层次结构中删除。我目前的情况是,ui按钮有时应该是可见的。何时隐藏ui按钮,何时将其从superview中删除 更改视图层次结构是否昂贵 如果您需要交替显示和隐藏子视图,最好的方法肯定是隐藏它。对于ui按钮来说,内存的影响无论如何都不是那么大。如果只切换hidden属性,代码肯定会更简单 另外,您还可以获得另一个优势,即hidden属性是可设置动画的 我在iOS6 iPad

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

我已经读到,不需要的视图应该从视图层次结构中删除。我目前的情况是,
ui按钮
有时应该是可见的。何时隐藏
ui按钮
,何时将其从superview中删除


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

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


另外,您还可以获得另一个优势,即
hidden
属性是可设置动画的

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

我最初认为,将“隐藏”设置为“是”将使视图不被渲染/绘制,因此拥有大量隐藏视图不会影响效率。但实际结果是: 1) 如果我将大滚动视图中的屏幕外视图设置为隐藏(并在它们返回可见区域时取消隐藏),则滚动根本不是平滑/连续的。当它自然减速时,它看起来非常紧张。
2) 如果我从滚动视图中删除屏幕外的视图(但仍保留在内存中,并带有跟踪阵列,这样当它们返回时可以立即添加),滚动显然会更平滑。

从最初的问题到(正确的)被接受的答案之间已经过了几年。让我添加另一个因素:与此同时,苹果公司引入了自动布局,正如一些人所说,在某些(深层)子视图层次结构中,它可能会带来相当大的性能损失


如果您使用的是自动布局,则隐藏的视图仍将进行布局,而不是删除的视图(其引用保存在某个位置)。根据您的场景,这可能会造成性能差异。

那么,呈现隐藏的UIView与视图层次结构中没有该视图有什么区别?有区别吗?是的。如果它已被删除,您基本上是从头开始重新创建它。这可能对内存管理有好处,但可能对性能有坏处,因为无法设置更改的动画。如果保留对视图的引用,则不必重新创建它。我对改变视图层次结构的开销感兴趣。这种改变会触发什么。我认为它基本上改变了UIKit作为视图层次结构表示所管理的树结构。你认为这准确吗?纠正你对参考资料的看法。我认为隐藏方法更有效,这正是你所说的原因。但是,您必须创建一个相当强大的测试场景,才能感受到这种差异。(例如,许多表视图单元格滚动得非常快……)这实际上向我重申了一个事实,即将UIView设置为“隐藏”可以避免渲染,并可能以某种方式提高性能。当然,这种跳跃是因为它“未隐藏”,这可能会迫使setNeedsDisplay和setNeedsLayout(不确定后者)一起显示,这将有助于降低速度。对于tableview来说,这可能是一个坏主意,但对于“在”其他视图后面的更大的视图,最好将其隐藏起来,以便在不需要时不会触发不必要的重画。“2)如果我从滚动视图中删除屏幕外的视图(但仍然使用跟踪数组保留在内存中,这样当它们返回时可以立即添加)你能举个简单的例子吗?听起来是一种处理屏幕外视图的好方法(内存和性能方面)。