• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

iOS 性能优化方案-启动优化

武飞扬头像
水木灵辰O
帮助1

1、冷启动(从零开始的启动)

冷启动三个阶段

1.1 Main函数执行前

  • 加载可执行文件(mach-o文件)
  • 加载动态链接库,进行rebase指针调整和bind符号绑定
  • Objc运行时的初始化处理,包括Objc相关类的注册、category注册、selector唯一性检查
  • 初始化,包括执行了 load()方法、attribute((constructor))修饰的函数调用、创建C 静态全局变量

优化方案

  • 减少动态库加载。每个库本身都有依赖关系,苹果公司建议使用更少的动态库,并且建议在使用动态库的数量较多时,尽量将多个动态库进行合并。数量上,苹果公司建议最多使用 6 个非系统动态库。

使用到的动态库有AMap高德地图、Charts图表、UMSocial友盟

删除未使用到的iflyMSC科大讯飞语音

  • 减少加载启动后不会去使用的类或者方法

1.整理AppDelegate.m中逻辑,删除不使用的类和方法,减少启动编译时间

2.取消打印废日志NSSLog

  • load() 方法里的内容可以放到首屏渲染完成后再执行,或使用  initialize() 方法替换掉。 因为,在一个 load() 方法里,进行运行时方法替换操作会带来 4 毫秒的消耗。不要小看这 4 毫秒,积少成多,执行  load() 方法对启动速度的影响会越来越大
  • 控制 C  全局变量的数量

删除不使用的宏定义等全局变量

1.2 Main函数执行后

主要是指main()函数执行开始,到AppdelegatedidFinishLaunchingWithOptions方法里首屏渲染相关方法的执行

  • 首屏初始化所需要配置文件的读写操作
  • 首屏列表大数据的读取
  • 首屏渲染的大量计算

优化方案

从功能上梳理出哪些是首屏渲染必要的初始化功能,哪些是 App 启动必要的初始化功能,而哪些是只需要在对应功能开始使用时才需要初始化的。梳理完之后,将这些初始化功能分别放到合适的阶段进行

APP启动必要的初始化功能:

友盟平台设置、高德地图设置、注册系统推送、自定义启动动画LaunchAnimation检测版本更新、向服务器请求功能权限

对应功能开始使用时才需要初始化功能:

内部引导页Guidance、登录状态CheckLogin、实时会议弹窗定时任务、实时位置上传定时任务、Socket消息长连接、向服务器注册推送、本地通知

1.3 首屏渲染完成

从渲染完成时开始,到 didFinishLaunchingWithOptions 方法作用域结束时结束

优化方案

  • 功能级优化  
    main() 函数开始执行后到首屏渲染完成前只处理首屏相关的业务,其他非首屏业务的初始化、监听注册、配置文件读取等都放到首屏渲染完成后去做
  • 方法级优化  
    检查首屏渲染完成前主线程上有哪些耗时方法,将没必要的耗时方法滞后或者异步执行。通常情况下,耗时较长的方法主要发生在计算大量数据的情况下,具体的表现就是加载、编辑、存储图片和文件等资源

登录动画执行时,异步执行向苹果服务器请求版本内容结果,并自动登录

2、热启动

  • App在内存中,在后台存活着,再次点击图标进入App

3、APP启动的监控手段

  • 定时抓取主线程上的方法调用堆栈,计算一段时间里各个方法的耗时
  • 对 objc_msgSend 方法进行 hook 来掌握所有方法的执行耗时

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggggga
系列文章
更多 icon
同类精品
更多 icon
继续加载