gitHub学习地址:https://github.com/potato512/SYDemo_TablePerformance
UITableView的性能优化
1、使用reuseIdentifier来重用cells2、缓存cell的行高
(1)当cell的行高是固定的时,使用固定行高;
(2)当cell的行高是不固定时,根据内容进行计算后缓存起来使用。第一次肯定会计算,后续使用缓存时就避免了多次计算;高度的计算方法通常写在自定义的cell中,调用时,既可以在设置cell高的代理方法中使用,也可以自定义的model中使用(且使用时,使用get方法处理);
(3)另外需要注意,cell的赋值和cell行高的计算需要分开,否则也会造成内存爆增,且界面异常的卡顿;
3、减少subviews的数量
(1)自定义的子视图可以整合在形成一个整体的就整合成一个整体的子视图;
(2)同时使用drawRect进行绘制(即将GPU的部分渲染转接给CPU);
(3)异常绘制,且设置属性"self.layer.drawsAsynchronously = YES;";
4、数据处理
(1)使用正确的数据结构来存储数据;
(2)数据尽量采用局部的section,或cellRow的刷新,避免reloadData;
(3)大量数据操作时,使用异步子线程处理,避免主线程中直接操作;
5、图片处理
(1)使用异步子线程处理,然后再返回主线程操作
(2)图片缓存处理,避免多次处理操作
(3)图片圆角处理时,设置layer的shouldRasterize属性为YES,可以将负载转移给CPU
6、按需加载内容
(1)滑动操作时,只显示目标范围内的cell内容,显示过的超出目标范围内之后则进行清除;
(2)滑动过程中,不加载显示图片,停止时才加载显示图片;
7、使用drawRect,或CALayer进行文本或图片的绘制
其他可能出现影响的处理:
1、如果cell内现实的内容来自web,使用异步加载,缓存请求结果
2、尽量使所有的view的opaque属性为YES,包括cell自身,以提高视图渲染速度(避免无用的alpha通道合成,降低GPU负载)
3、避免渐变,图片缩放的操作
4、使用shadowPath来画阴影
5、尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果
示例Demo
未优化前:用户操作时,耗时、界面卡顿、且内存异常。
优化后:用户操作流畅,内存稳定。