ios - viewWillDisappear 和 viewDidDissapear 之间的延迟

标签 ios objective-c performance optimization uiview

一段时间后,我发现我的应用程序性能有所下降,我想弄清楚到底是怎么回事。

我有一个复杂的 View Controller (VC1),其中包含 ScrollView 、内部的几个 TableView 、一些具有水平滚动和自定义绘图的自定义单元格等。

当我尝试调用 presentViewController 将另一个 View Controller 推到 VC1 之上时,所有这些对象(重新加载表、重新定位 subview 等)经过几次(大约 10 次)刷新后,我可以看到 viewWillDisappear 之间有大约 2 秒的延迟> 和 viewDidDissapear

我试图对应用程序进行概要分析以查看是否存在内存泄漏,但没有找到。当 View 刷新并在不同模式之间切换时,内存使用量会增加,但随后它会在 30m 左右变得或多或少稳定。

在模拟器中运行良好,但在 iPhone5 上显示速度较慢。只有当我尝试从该 View Controller 切换 时,这种缓慢才可见。

我运行了一个分析器并记录了这 2 秒的用处。这是跟踪文件的链接:https://dl.dropboxusercontent.com/u/6402890/trace.trace.zip

正如我所见,UIKit 花费的大部分时间都在进行布局。

我可以做些什么来优化它?有没有办法拍摄 View 的快照并将其用于“离开 View ”动画并在我们回来时恢复 View 层次结构?

更新:为探查器添加屏幕截图(点击查看完整分辨率):

screenshot

更新 2:

分析 recursiveDescription 的输出后,我可以看到以下内容:

  • 在最简单的情况下,我的输出大约有 200 行。性能还可以。
  • 当我切换到更复杂的场景层次结构时, View 增长到约 500 行,但仍然执行正常。
  • 多次刷新后,这个数字会达到 ~2000,这就是它变慢的地方。分析 2000 个 View 的输出,我可以看到其中约 1500 个属于隐藏单元格,这些单元格甚至不再在此模式下显示。当我刷新表格 View 时,单元格类型也会发生变化,并且我正在使用不同的单元格,但为什么不再使用的单元格仍在表格 View 的 subview 中?

有什么建议吗?

最佳答案

从你的堆栈来看,我怀疑你添加了大量你不想添加的 View 。由于它与重新加载有关,我会检查您的重新加载逻辑并确保它不会在不删除以前的 View 的情况下重新添加层次结构中的所有 View 。您可以编写快速调试例程使用-recursiveDescription 递归遍历每个 View 的-subviews 并将它们打印出来以查看层次结构中的内容.

您的问题可能出在图层层次结构而不是 View 层次结构中,但您描述的症状让我想到了 View 。


编辑:从您的更新来看,您可能正在进行以下两件事之一。最有可能的是,如果这些是实际的 UITableViewCells 甚至不应该再存在,那么您在某处有一个保留循环。或者,您的 cellForRowAtIndexPath: 可能不正确,并且可能在它应该只是重新配置单元格时向现有单元格添加新 View 。

不过,无论哪种情况,对于“最佳情况”而言,200 次观看次数似乎都很多。您可能在应该进行自定义绘图的地方过度使用了 View 。如果性能没问题,那么……好吧,但我会在您支持的最慢设备上仔细测试。

关于ios - viewWillDisappear 和 viewDidDissapear 之间的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23435633/

相关文章:

ios - isEqualToString 没有按预期工作?

java - Java中有多少个JDBC连接?

javascript - 在平板电脑上忽略 html 页面中的点击

ios - 将可选 TextView 的顶部 anchor 限制为底部 anchor

c# - Xamarin:从(共享项目)加载数据库的 Assets 路径

ios - 收到苹果推送通知时从 Storyboard 打开一个 View Controller

ios - NSFileManager createFileAtPath 在 iPad 上失败但在模拟器上工作

ios - Auth0 Credentials 对象的到期日期属性始终为零

ios - 有什么方法可以将参数的 NSDictionary 附加到 NSURLRequest 而不是手动制作字符串?

Android 内部 URI 架构原因