参考:
优化方案
UITableView
缓存池存储 cell,复用 cell:
- 在
cellForRowAtIndexPath:回调的时候只创建实例,快速返回cell,不绑定数据。 - 在
willDisplayCell: forRowAtIndexPath:的时候通过dequeueReusableCellWithIdentifier:方法取缓存的 cell,通过initWithStyle:reuseIdentifier:绑定数据(赋值)。
缓存高度:
- 在
tableView滑动时,会不断调用heightForRowAtIndexPath:,当cell高度需要自适应时,每次回调都要计算高度,会导致 UI 卡顿。为了避免重复无意义的计算,需要缓存高度。 - 通过 Dictionary 或 NSCache 的方式进行缓存;
- 开源项目:FDTemplateLayoutCell
视图层级优化
不要动态创建视图:
- 在内存可控的前提下,缓存
subview;善用hidden。
减少视图层级:
- 减少
subview的数量,使用layer中的drawrect绘制,这样可以利用 GPU 离屏渲染; - 少用
clearColor,maskToBounds,阴影效果等,可以避免 GPU 离屏渲染;
图片优化:
- 优化图片大小,尽量不要动态缩放(
contentMode),避免图形特效,图片缩放颜色渐变等; - 尽可能将多张图片合成为一张进行显示;
- 不要用
JPEG的图片,应当使用PNG图片。 - 子线程预解码(
Decode),主线程直接渲染。因为当image没有Decode,直接赋值给imageView会进行一个Decode操作从而阻塞主线程。
- 设置不透明
- 不要阻塞主线程,将处理放到子线程中去处理设置最大线程数为 2,利用
NSOperationQueue的maxConcurrentOperationCount为 2;