最近在看戴铭老师的《iOS高手开发课》,顺便记一下笔记,加深一下印象,这一篇是讲关于APP启动的优化与监听
相关的问题,现在很多公司都对自己的APP启动速度有极高的要求,特别是支付相关的APP,戴老师举了一个特别现实的例子,假如你在排队买东西时,掏出手机打开软件A支付,半天打不开,而打开软件B支付,秒开,想必你以后再也不会用软件A了吧,那么接下来就看一下启动的那些事。
先来看一下APP启动都干了哪些事情,APP的启动分为冷启动
和热启动
。
冷启动:APP点击启动之前,它的进程不在系统里面,需要系统新给它分配一个进程,这是一次完整的启动。
热启动:就是我们已经启动了APP,但是我们将它放在后台,它的进程已经在系统中了,用户再次点击APP重新进入的过程。
我们所说的APP启动优化主要就是优化冷启动
部分,如果想优化那么我们就要知道APP启动时到底干了什么,其实从用户点击APP到软件启动,主要分为三个部分:main()函数执行前
,main()函数执行后
,首屏渲染完毕
。
main()函数执行前:
1.加载可执行文件(App 的.o 文件
的集合)。
2.加载动态链接库进行 rebase 指针
调整和 bind 符号
绑定。
3.Objc运行时的初始处理,包括Objc相关类的注册,category
的相关注册,selector
的唯一性检查等。
4.初始化,包括了执行 +load()
方法、attribute((constructor))
修饰的函数的调用、创建 C++静态全局变量
。
这里可以做的优化:
1.减少动态库
的加载,苹果建议使用更少的动态库,当动态库数量多时,可以在数量上进行合并
,最多支持6个动态库进行合并。
2.减少加载启动后不会去使用的类或者方法。
3.+load
方法尽量放在首屏渲染之后执行,或者使用+initialize
方法替换掉。
4.控制C++全局变量
的数量。
main()函数执行后:
指的是从main函数
执行开始到appdelegate
中的didFinishLaunchingWithOptions
方法中的首屏渲染相关方法执行完毕。
1.首屏初始化所需配置文件的读写操作
2.首屏列表所需数据的获取
3.首屏渲染的计算
开发中大家都喜欢把各种SDK的初始化放在didFinishLaunchingWithOptions
里面,可以根据功能,业务需求分类,按需进行初始化,将这些SDK放在不同的阶段进行初始化。
首屏渲染完成之后
这时用户已经可以看到我们的软件界面了,在这里主要做的就是其他非首屏业务模块的初始化,监听的注册,配置文件的读取等。从函数上看就是从首屏渲染结束,到didFinishLaunchingWithOptions
这个函数的作用域结束。这时虽然用户已经可以看到我们的界面了,但是如果在主线程中有阻塞线程的操作,还是需要优化,不然还是会使用户体验不好。
网友评论