参考:
优化方案
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;