美文网首页
一个刚解决的比较低端的Bug

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

作者: Duke_Young | 来源:发表于2018-01-04 16:24 被阅读8次

    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%的卡死现象。

    自我反省

    谦虚谨慎 戒骄戒躁

    相关文章

      网友评论

          本文标题:一个刚解决的比较低端的Bug

          本文链接:https://www.haomeiwen.com/subject/ghbrnxtx.html