iOS 性能优化

一、耗电优化

  • 少用定时器

  • 优化I/O操作

    • 尽量不要频繁写入小数据,最好批量一次性写入
    • 读写大量重要数据时,考虑用dispatch_io,其提供了基
      于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问
    • 数据量比较大的,建议使用数据库(比如SQLite、CoreData)
  • 网络优化

    • 如果多次请求的结果是相同的,尽量使用缓存
    • 使用断点续传,否则网络不稳定时可能多次传输相同的内容
    • 网络不可用时,不要尝试执行网络请求
  • 定位优化

    • 如果只是需要快速确定用户位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电
    • 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
    • 尽量降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest
  • 硬件检测优化

    • 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件

二、App启动优化

主要分为冷启动和热启动,优化主要是针对热启动的

2.1、打印启动时间

  • 通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments)
  • DYLD_PRINT_STATISTICS设置为1

2.2、冷启动分为3个阶段

  • dyld
    1、减少动态库、合并一些动态库(定期清理不必要的动态库)
    2、减少Objc类、分类的数量、减少Selector数量(定期清理不必要的类、分类)
    3、减少C++虚函数数量
    4、Swift尽量使用struct

  • runtime
    1、用+initialize方法和dispatch_once取代所有的attribute((constructor))、C++静态构造器、ObjC的+load

  • main
    1、在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在finishLaunching方法中
    2、按需加载

三、卡顿优化

3.1、CPU优化

  • 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView
  • 不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改
  • 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
  • Autolayout会比直接设置frame消耗更多的CPU资源
  • 图片的size最好刚好跟UIImageView的size保持一致
  • 控制一下线程的最大并发数量
  • 尽量把耗时的操作放到子线程
    1、文本处理(尺寸计算、绘制)
    2、图片处理(解码、绘制)

3.2、GPU

  • 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示

  • GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸

  • 尽量减少视图数量和层次

  • 减少透明的视图(alpha<1),不透明的就设置opaque为YES

  • 尽量避免出现离屏渲染

四、离屏渲染解决方案

4.1、

你可能感兴趣的:(iOS 性能优化)