iOS App启动优化

一、“冷启动”与“热启动”

冷启动
App点击启动前,此时App的进程还不在系统里。
需要系统新创建一个进程分配给App。(这是一次完整的App启动过程)

热启动
App在冷启动后用户将App退回后台,此时App的进程还在系统里。
用户重新返回App的过程。(热启动做的事较少)

二、App的完整启动流程(冷启动流程)

1、main() 函数执行前(pre-main阶段)

我们可以通过设置环境变量DYLD_PRINT_STATISTICS来起到监控main() 函数执行前启动时间

打印出来时间解释如下:

  • dylib loading time:动态库的载入耗时,苹果建议项目中自定义的动态库最好不要超过6个动态库,如果超过了6个要考虑动态库合并;
  • rebase/binding time:偏移修正(rebase)和符号绑定(binding)的耗时;偏移修正是一个安全机制--ASLR,原理是生成一个随机值,加到应用内存地址的前面,来起到方法、函数的地址随机的目的,解决安全问题.所有的方法、函数和数据的内存地址都会在原有的真实地址上加上这个随机值,并且每次启动的时候这个随机值是不同的,这样别人就没法拿到方法、函数或数据的真实地址了;符号绑定是指将方法名与方法的实现,即sel和IMP的绑定。
  • ObjC setup time:Object-C类的注册的耗时;不权威统计,每增加20000个类,这个时间增加800ms;减少类的数量可以减少启动耗时;
  • initializer time:load方法和构造方法的耗时.所以项目中要尽量减少重写load 方法,将load方法的操作放在initialization中.

2、main() 函数执行后(从main函数执行,到didFinishLaunchWithOptions方法作用域结束

    优化方向:

  • 减少数据的加载,最好使用懒加载,如一个第三文库的加载;
  • 将项目中不再使用的类和方法去掉;
  • 使用多线程技术加载数据,充分利用cpu的资源;
  • 启动时刻的界面,不要使用storyboard或xib,尽量使用纯代码,因为storyboard或xib有一步代码转换的操作,也是会耗时的。

 

猜你喜欢

转载自blog.csdn.net/shuzhi57/article/details/114262734