启动优化:
main函数之前
- 合并动态库,减少不必要的framework,特别是第三方的。因为动态链接比较耗时。
- 删减一些无用的静态变量
- 删减没有被调用到或者已经废弃的方法
- 将不必须在+load方法中做的事情延迟到+initialize中
main函数之后: - 尽量使用纯代码编写,减少xib的使用;
- 启动阶段的网络请求,是否都放到异步请求;
- 避免在主线程进行大量的计算,将与首屏无关的计算内容放在页面展示后进行,缩短 CPU 计算时间
- 避免使用大图片,减少视图数量及层级,减轻 GPU 的负担
- 只请求首屏相关的网络数据
- 本地缓存首屏数据,待渲染完成后再去请求新数据。
卡顿优化:
CPU:
- 尽量用轻量级的对象,比如用不到事件处理的地方使用CALayer取代UIView
- 尽量提前计算好布局(例如cell行高)
- 控制一下线程的最大并发数量
- 尽量把耗时的操作放到子线程
- 高度缓存: 在tableView滑动时,会不断调用heightForRowAtIndexPath:,当 cell 高度需要自适应时,每次回调都要计算高度,会导致 UI 卡顿。为了避免重复无意义的计算,需要缓存高度。
- 按需加载: 局部刷新,刷新一个cell就能解决的,坚决不刷新整个 section 或者整个tableView,刷新最小单元元素。 利用runloop提高滑动流畅性,在滑动停止的时候再加载内容,像那种一闪而过的(快速滑动),就没有必要加载,可以使用默认的占位符填充内容。
- 图片处理(解码、绘制)
图片都需要先解码成bitmap才能渲染到UI上,iOS创建UIImage,不会立刻进行解码,只有等到显示前才会在主线程进行解码,固可以使用Core Graphics中的CGBitmapContextCreate相关操作提前在子线程中进行强制解压缩获得位图
作者:SimonYe
链接:https://juejin.cn/post/6844904004053368846
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
GPU:
- 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
- 尽量避免出现离屏渲染.
- 图片显示原始大小
参考链接
内存优化:
内存泄漏
ARC 模式下,开发者不再需要手动释放内存,所有内存泄漏基本都是由于对象循环引用引起的。可通过申明弱引用 weak 或 unowned 来避免循环使用。
图片读取
imageNamed 会被缓存到内存中,适用于频繁使用的小图片;imageWithContentOfFile 适用于大图片,持有者生命周期结束后既被释放。
其它优化
构建缓存时使用 NSCache 替代 NSMutableDictionary
NSCache 是线程安全的,当内存不足时会自动释放内存(取数据时需要先判空),并且可以通过 countLimit 和 totalCostLimit 属性设置上限,另外对存在 Compressed Memory 情况下的内存警告也做了优化,这些都是 NSDictionary 不具备的。