问: 简述一下iOS的App冷启动过程.


  • 阶段1: dyld (dynamic link editor) ,

    dyld 是iOS的动态链接器, 可以用来装载Mach-O文件.

    • 装载App的可执行文件,同时递归装载所有依赖的动态库.
    • 当dyld装载完成之后,就会通知Runtime执行下一步操作.

  • 阶段2: Runtime

    可执行文件和动态库中所有的符号(Class,Protocol, Seletor, IMP ...) 都按照格式加载到内存中,被Runtime所管理.

    Runtime在App启动时主要工作有以下内容:

    • 调用 map_images 进行可执行文件内容的解析与处理.
    • 在load_images中会调用 call_load_methods, 调用所有Class和Category的load方法.
    • 进行各种objc结构的初始化(注册Ojbc类、初始化类对象等).
    • 调用C++的静态初始化器和 __attribute__(constructor) 修饰的函数.

  • 阶段3: main

    所有初始化工作完成之后dyld就会调用main函数.

    main函数就会调用UIApplicationMain函数,Appdelegate中得application: didFinishLaunchingWithOptions:


问: 简述一下iOS的App冷启动优化.


  • dyld阶段

    • 减少动态库、动态合并清理动态库.
    • 减少Objc类、Catagory类、减少Selector的数量(定时清理)
    • 减少C++虚函数的数量
  • runtime

    • 尽量使用initialize方法和dispatch_once取代所有的C++的静态初始化器和 __attribute__(constructor)以及Load方法.
  • main

    • application: didFinishLaunchingWithOptions: 尽量不要做一些延时操作.

问: 简述一下iOS的App包体积优化.


  • 定期清理图片资源.(推荐)
  • 减少静态库
  • 定期清理不需要的类.

IT界无底坑洞栋主 欢迎加Q骚扰:676758285