iOS 如何优化 App 的启动耗时

iOS 的 App 启动时长大概能够这样计算:

  • t(App 总启动时间) = t1(main 调用以前的加载时间) + t2(main 调用以后的加载时间)
  • t1 = 系统 dylib(动态连接库)自身 App 可执行文件的加载
  • t2 = main方法执行以后到AppDelegate类中的application:didFinishLaunchingWithOptions:方法执行结束前这段时间,主要是构建第一个界面,并完成渲染展现

1. 在**t1**阶段加快**App**启动的建议:markdown

  • 尽可能使用静态库,减小动态库的使用,动态连接比较耗时,若是要用动态库,尽可能将多个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()有性能和死锁的可能性
  • 在初始化方法中不建立线程

2. 在**t2**阶段加快**App**启动的建议:网络

  • 尽可能不要使用xib/storyboard,而是用纯代码做为首页UI,若是要用xib/storyboard,不要在xib/storyboard中存放太多的视图
  • application:didFinishLaunchingWithOptions:里的任务尽可能延迟加载或懒加载
  • 不要在NSUserDefaults中存放太多的数据,NSUserDefaults是一个plist文件,plist文件会被反序列化一次
  • 避免在启动时打印过多的log,少用NSLog,由于每一次NSLog的调用都会建立一个新的NSCalendar实例
  • 为了防止使用GCD建立过多的线程,解决方法是建立串行队列,或者使用带有最大并发数限制的NSOperationQueue
  • 不要在主线程执行磁盘、网络、Lock或者dispatch_sync、发送消息给其余线程等操做

推荐视频详解:

         iOS应用启动优化

相关文章
相关标签/搜索