UIView: alpha:0, hidden:YES, removeViewFromSuperview 和 frame.origin.y = -100000 之间的性能/内存差异;

Posted

技术标签:

【中文标题】UIView: alpha:0, hidden:YES, removeViewFromSuperview 和 frame.origin.y = -100000 之间的性能/内存差异;【英文标题】:UIView: Performance/memory difference between alpha:0, hidden:YES, removeViewFromSuperview and frame.origin.y = -100000; 【发布时间】:2014-02-12 12:44:10 【问题描述】:

暂时隐藏视图(例如,直到加载完成)时,什么对设备最有利?

将 alpha 设置为 0? 将隐藏设置为“是”? 从超级视图中删除视图? 将视图移动到无法在窗口/屏幕上显示的位置(例如 frame.origin.y = -10000)?

哪个在内存方面最好,哪个在性能方面最好?我知道 Apple 在某处写过一些关于此的内容,但我找不到。

【问题讨论】:

Performance of UIView: removeFromSuperview VS hide 的可能重复项 @James 好吧,我认为它不能涵盖所有替代方案 @James 同样,内存与性能一样重要。 【参考方案1】:

哪个记忆力最好

removeFromSuperview 是记忆力最好的。为什么 ?因为它会导致视图被释放。因此,如果视图未被其他任何人保留(如强 ivar),它将被释放。

哪个性能最好?

setHidden: 在性能方面是最好的。为什么 ?因为这个动作只是设置一个标志。然后在 drawRect 中它只是一个 BOOL 检查。所以它真的很快,因为不涉及其他操作。

【讨论】:

【参考方案2】:

所以,最快的方法优先:

    setHidden(仅从渲染中丢弃视图) alpha0 等于 setHidden, but it first checks if0` removeFromSuperView(需要一些步骤:释放对象,从堆栈(指针)中弹出,从渲染堆栈中删除...) frame.origin.y=-10000 > 必须移动整个位数组并检查视图是否超出范围。不是很快...

【讨论】:

以上是关于UIView: alpha:0, hidden:YES, removeViewFromSuperview 和 frame.origin.y = -100000 之间的性能/内存差异;的主要内容,如果未能解决你的问题,请参考以下文章

UIView alpha 0 但仍接收触摸事件?

UIView alpha = 0 导致触摸被拖放到下面的视图

UIView: alpha:0, hidden:YES, removeViewFromSuperview 和 frame.origin.y = -100000 之间的性能/内存差异;

UIView 属性 hidden = YES vs alpha = 0.0f

UIView的不透明alpha和背景颜色之间有什么关系?

UIView 和子视图 - 不透明度