【问题标题】:Why is UIButton frame setting so slow为什么 UIButton 框架设置这么慢
【发布时间】:2014-03-13 11:35:52
【问题描述】:

最近我一直在对某个应用的工具进行一些性能分析。这是我注意到的:

即UIButton框架设置很慢。

为了排除它是由类型转换(从 int 到 CGFloat)引起的可能性,我尝试了以下方法:

我也试过了:

不,也没有多大帮助。

最后但并非最不重要的一点是,我确定它不是由 CGRectMake 引起的:

该函数被调用了大约650-670次,这使得每帧设置调用大约0.173ms?听起来对吗?如何提高性能?

【问题讨论】:

    标签: ios iphone xcode instruments


    【解决方案1】:

    嗯...我不是 100% 确定,但您使用的是具有固定大小的按钮类型 UIButtonTypeDetailDisclosure

    尝试只设置它的中心而不是框架。

    myDetailButton.center = CGPointMake(12, 12);
    

    而不是...

    myDetailButton.frame = CGRectMake(0, 0, 23, 23);
    

    f 也不是必需的,IIRC 实际上在使用时会占用比所需更多的内存。只需使用2323.0 而不是23.0f。不过,我必须为此找到参考。

    编辑

    话虽如此,我刚刚在问题底部看到了您的计时统计信息。

    您在此处看到的百分比是相对的。 0.173ms 几乎没有时间。

    如果不多次运行该函数,您可能会获得更好的性能提升。你运行它 700 次。好多啊!你真的需要运行它很多次吗?您甚至无法一次在屏幕上放置那么多按钮。

    也许您需要将它们出列?毕竟你使用的是MKMapView

    【讨论】:

    • 出队是什么意思?
    • 好吧,我需要查看更多代码才能弄清楚您要对按钮执行什么操作。 tableView 和 collection view 管理它们的单元格的方式与 map 管理注释视图的方式相同。如果一个表格有 100 个项目,但屏幕上只有 10 个,那么它只会创建 10 个单元格。然后,当一个单元格离开屏幕时,该单元格再次被标记为可用于下一个项目,因此只有 10 个单元格。做这样的事情而不是将 700 个按钮加载到内存中是有意义的。只够在屏幕上显示并重复使用它们。
    • 非常感谢您的帮助,但这有点困难,因为服务器在第一次查询时返回了 600+ 个结果,所以除非我更改查询的处理方式,否则无法解决很容易。
    • 您仍然可以拥有一个包含 600 个项目的数组。但只需为在任何给定点实际出现在屏幕上的按钮加载按钮。
    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2016-09-28
    • 2020-02-08
    • 2012-07-17
    • 2011-11-07
    • 2015-08-24
    • 2013-08-06
    相关资源
    最近更新 更多