我有一个已经投入生产一段时间的应用程序,但在iOS 7上,在与应用程序交互一段时间后,转换有明显的延迟.我用时间分析器来看看需要多长时间,这cache_eraseImp_nolock似乎是罪魁祸首.(这需要花费更多的时间objc_msgSend!)看起来这是在视图控制器转换发生时调用的.(推动视图控制器,呈现模态视图控制器等)
有没有人看到类似的东西?我该怎么做才能防止这个问题?
我试图用从头开始构建的应用程序重现这个问题,但到目前为止还没有运气.

iOS 7.0已逐步淘汰UIAppearance并在某些情况下使其不稳定.检查您对基于UIAppearance的API的调用,并在必要时将其删除.*
iOS 7.1似乎已经解决了很多错误,加快了UIAppearance与运行时的交互.自iOS 6以来,UIAppearance的语义仍然发生了巨大的变化.请谨慎行事.
*当iOS 7 beta SDK出局时,这只是部分正确.
iOS7.0.x上的UIAppearance速度非常慢.通过上面的堆栈跟踪,似乎应用外观方法每次(或至少多次)调用method_exchangeImplementations(),这反过来必须清除ObjC运行时中针对目标类和所有子类的缓存,它将在它做到这一点时保持全局锁定 - 非常慢.我不知道UIAppearance是否发生了变化,或者ObjC运行时是否发生了变化,这使得这个案例在病理上比过去慢得多.
另外,我想我已经看到UILabel setShadowOffset:和setShadowColor:方法也很慢,因为它们似乎是外观混合版本,因此具有相同的问题(尽管事实上它们没有标记为UI_APPEARANCE_SELECTOR).
一个整体解决方案就是不要使用UIAppearance或者根本不使用UIAppearance.对于UILabel方法,首先检查值是否需要更改,如果不需要则不要调用setter.
另一个可能的解决方案是CTAppearance,它是UIAppearance的重新实现,至少对于基于UIView的调用(它对UIBarItem外观调用没有任何作用,它仍然很慢).它目前只需要拉取请求中的一些补丁,并且在没有一些帮助的情况下不会处理UIPopover容器.它的行为也会与UIAppearance有点不同(例如,它可能会覆盖一些显式设置的值,具体取决于它们何时被调用),但在某些情况下它可能会有所帮助(很多).
注意: UIAppearance似乎在iOS 7.1中得到修复.
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |