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%的卡死现象。
自我反省
谦虚谨慎 戒骄戒躁
网友评论