iOS App启动优化

App启动优化

app的启动方式分类
1.冷启动(Cold Launch):从零开始启动app
2.热启动(warm launch):App已经存在于内存中,在后台存活着,再次点击app图标进入app界面。此处主要记录app冷启动优化。
优化app冷启动时间
通过添加华宁变量可以打印出APP的启动时间分析(Edit scheme-Run->Arguments)。添加DYLD_PRINT_STATISTICS设置为1。如果想要获取更加详细的信息,那就添加DYLD_PRINT_STATISTICS_DETAILS设置为1。
iOS App启动优化_第1张图片
APP启动的顺序

  1. dyld(dynamic link editor),Apple的动态连接器,用来装载Mach-O文件(可执行文件,动态库等)
  2. dyld检查Mach-O文件依赖的动态库,并且递归加载所有依赖的动态库
  3. 当dyld把可执行文件,动态库都装载完毕后,会通知runtime进行下一步的处理,runtime处理步骤如下。
  • 3.1. 调用map_images进行可执行文件内容的解析和处理
  • 3.2. 在load_images中调用call_load_methods,调用所有Class和Category中的+load()方法
  • 3.3. 进行各种objc结构的初始化(注册Objc类、初始化类对象等等)
  • 3.4. 调用C++的静态初始化器和__attribute__((constructor))修饰的函数。
  1. 所有初始化工作结束后,dyld才开始调用main()函数
  2. 最后是是UIApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法.

至此,可执行文件和动态库中所有的符号(Class,Protocol,Selector,IMP,…)都已经按格式成功添加到内存中,被runtime所管理。
按照不同阶段优化策略
dyld加载截断

  1. 减少动态库、合并一些动态库(定期清理不必要的动态库)
  2. 减少Objc类、分类的数量、减少Selector数量(定期清理不必要的类和分类)
  3. 减少C++虚函数的数量
  4. Swift尽量使用struct
    runtime使用
    尽量使用+initialize方法和dispatch_once取代所有的__attribute__((constructor))、C++静态构造器、Objc的+load方法
    main函数阶段
    在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在finishLaunching方法中
    简答说就是 按需加载

你可能感兴趣的:(iOS,objective-c)