3

iOS 如何优化 App 的启动耗时

 3 years ago
source link: https://gsl201600.github.io/2020/04/01/iOS%E5%A6%82%E4%BD%95%E4%BC%98%E5%8C%96App%E7%9A%84%E5%90%AF%E5%8A%A8%E8%80%97%E6%97%B6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

iOS 的 App 启动时长大概可以这样计算:

  • t(App 总启动时间) = t1(main 调用之前的加载时间) + t2(main 调用之后的加载时间)
  • t1 = 系统 dylib(动态链接库)自身 App 可执行文件的加载
  • t2 = main方法执行之后到AppDelegate类中的application:didFinishLaunchingWithOptions:方法执行结束前这段时间,主要是构建第一个界面,并完成渲染展示
  1. t1阶段加快App启动的建议:
  • 尽量使用静态库,减少动态库的使用,动态链接比较耗时,如果要用动态库,尽量将多个dylib动态库合并成一个
  • 尽量避免对系统库使用optional linking,如果App用到的系统库在你所有支持的系统版本上都有,就设置为required,因为optional会有些额外的检查
  • 减少Objective-C Class、Selector、Category的数量,可以合并或者删减一些OC
  • 删减一些无用的静态变量,删减没有被调用到或者已经废弃的方法
  • 将不必须在+load中做的事情尽量挪到+initialize中,+initialize是在第一次初始化这个类之前被调用,+load在加载类的时候就被调用。尽量将+load里的代码延后调用
  • 尽量不要用C++虚函数,创建虚函数表有开销
  • 不要使用 __attribute__((constructor))将方法显式标记为初始化器,而是让初始化方法调用时才执行。比如使用dispatch_once(),pthread_once()或 std::once()
  • 在初始化方法中不调用dlopen(),dlopen()有性能和死锁的可能性
  • 在初始化方法中不创建线程
  1. t2阶段加快App启动的建议:
  • 尽量不要使用xib/storyboard,而是用纯代码作为首页UI,如果要用xib/storyboard,不要在xib/storyboard中存放太多的视图
  • application:didFinishLaunchingWithOptions:里的任务尽量延迟加载或懒加载
  • 不要在NSUserDefaults中存放太多的数据,NSUserDefaults是一个plist文件,plist文件会被反序列化一次
  • 避免在启动时打印过多的log,少用NSLog,因为每一次NSLog的调用都会创建一个新的NSCalendar实例
  • 为了防止使用GCD创建过多的线程,解决方法是创建串行队列,或者使用带有最大并发数限制的NSOperationQueue
  • 不要在主线程执行磁盘、网络、Lock或者dispatch_sync、发送消息给其他线程等操作

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK