一个刚解决的比较低端的Bug

APP改版后拖了很久都没有上线,因为虽然审核通过了,但是发现在最新系统的几部手机iPhone6 7 X上都出现了快速反复滑动卡顿的现象,在解决这个问题上花了很长时间。

你手机降频了

最开始说自己卡顿的是一台升级到iOS11的iPhone 6 plus,所以不想调试的懒惰开发者(我)表示,你手机不行了,你该换手机了,你卡是因为你降频了,你看我这7就不卡……
结果紧接着发现最卡的是iPhone X……

卡顿现象

一句话即可描述:在快速滑动UICollectionView时发生卡顿。然而实际情况是,一开始很流畅,当反复快速上下滑动时,CPU会慢慢增加直至100%,此时如果切换到其他页面一切正常,一旦继续滑动该UICollectionView,CPU占用100%卡死。

优化UICollectionViewCell

一开始以为是Cell里各种绘制的问题,然后再次检查了Cell内的各个元素,按照百度来的文章一条条的对照,什么添加背景色,设置不透明,调整大小不要互相遮挡等一系列防着重新渲染的做法。无效
修改UICollectionView的加载顺序,复用NSDateFormatter,无效

Instruments说是手势问题

使用Instruments的Time Profiler和Core Animation进行调试,发现某xxxxGesturexxx方法随着时间的推移消耗了大量的CPU,最后一碰屏幕进行滚动就100%。
抱着对UIScrollViewDelegate的怀疑,注释掉了所有UIScrollView滚动的方法,依然卡顿无效

卧槽我哪里用手势了

鉴于还在用着iOS8系统的iPhone5非常流畅……所以同时开了个Instruments来进行对比,发现……iOS8上根本没有这个xxxGesturexxx,于是恍然大悟,这是3Dtouch的问题!为什么一开始没想到呢?因为最开始喊卡的是一台升级到iOS11的iPhone 6 plus啊,这货明明不支持3Dtouch,所以一开始没想到这个问题,总想着是iOS的某些问题。先验证一下,把registerForPreviewingWithDelegate方法注释掉,bingo,卡顿消失了。

潜伏很久的低级错误

这次bug的原因就是……对3Dtouch的简单粗暴的使用,当初在列表页添加这个功能的时候就是随便一加的作风,将registerForPreviewingWithDelegate方法放在了collectionView: cellForItemAtIndexPath:方法里,于是在滚动中造成该注册方法反复被调用以制引发了CPU占用率只增不降到100%的卡死现象。

自我反省

谦虚谨慎 戒骄戒躁

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,259评论 4 61
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,586评论 7 249
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 24,133评论 8 183
  • 我很喜欢乘坐公共交通,因为每天都会有不一样的故事,不一样的风景。甚至有时候觉得坐在公交车上,观望窗外的景色是一种幸...
    言内不言吾阅读 204评论 1 1
  • 外公以前是水厂的员工,他和外婆住在水厂的居民楼里,现在看来是很旧的楼,水泥地板,墙上从地面往上涂半面绿漆,也不漆满...
    西市阅读 375评论 0 0