Tino又想吃肉了

main开始到view的展示

Word count: 912Reading time: 3 min
2022/01/03

前文:从编译到运行

iOS 程序启动流程

在iOS中,程序的启动和装载从系统读取可执行文件头部为程序创造虚拟内存空间,到dyld进行运行前的动态库链接和image装载,到Runtime进行image mapping和objc setup,这里的过程都是在我们程序的main函数之前执行的,本篇文章主要讨论从main函数开始到屏幕显示页面这段时间会发生什么,main函数之前的这段时间看这篇文章

main

在runtime进行完image mapping和objc setup后,前面的dyld阶段的工作完成,程序的真正入口main函数被写入程序计数器PC中,CPU控制权交还给程序入口。这时候main函数才开始运行。

在iOS中,main函数一般是这样的。

-w713

一般来说,开发中不用修改main函数中的代码。可以看到这里调用了UIApplicationMain()函数。

UIApplicationMain()函数的内部,创建了一个UIApplication的实例,然后创建一个Application的delegate,同时创建main thread的RunLoop,开始事件循环。所以在main函数中,return了UIApplicationMain()函数实际上是创建了Runloop循环,也就是说只要main runloop存在main函数就不会返回,一旦返回程序就终止了。

在Apple的文档中,可以找到这张图。

-w670

从上图中可以得到以下信息

  • 1.系统调用main函数
  • 2.main函数调用UIApplicationMain(),在函数内部创建一个UIApplication实例
  • 3.读取info.plist文件和加载默认storyboard
  • 4.调用application:willFinishLaunchingWithOptions:
  • 5.restore UI state,此步仅当app支持restore且application:shouldRestoreApplicationState:方法return YES时执行
  • 6.调用application:didFinishLaunchingWithOptions: method

自此,main方法的流程执行完毕。开始执行在appdelegate或者scenedelegate中调用的方法以完成第一帧页面的展示。

界面

在文档中,有这一段话。After the launch sequence completes, the system uses your app or scene delegates to display your app’s user interface and to manage its life cycle.意思就是当启动流程完成后,即main函数执行完毕,系统就会调用app delegate或者scene delegate来展示app的UI界面并且管理它的生命周期

在scene delegate中,我们初始化了UIWindow,并创建了Root ViewController。

在iOS中,程序的状态转换如下图。

-w389

application:didFinishLaunchingWithOptions: method方法执行后,程序要开始运行了,这时会转入Active状态。对应的,会调用applicationDidBecomeActive方法。

当退到后台时,则会进入inactive->Background状态,处在Background状态的进程,如果没有特殊处理(比如音乐后台播放),在一段时间后就会转入Suspended挂起状态。

而要显示View前,View Controller也有它自己的生命周期流程

  • initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
  • loadView:加载view
  • viewDidLoad:view加载完毕
  • viewWillAppear:控制器的view将要显示
  • viewWillLayoutSubviews:控制器的view将要布局子控件
  • viewDidLayoutSubviews:控制器的view布局子控件完成
  • 这期间系统可能会多次调用viewWillLayoutSubviews 、 viewDidLayoutSubviews 俩个方法
  • viewDidAppear:控制器的view完全显示
  • viewWillDisappear:控制器的view即将消失的时候
  • 这期间系统也会调用viewWillLayoutSubviews 、viewDidLayoutSubviews 两个方法
  • viewDidDisappear:控制器的view完全消失的时候

可以看到,View Controller经历了

  • init
  • load view
  • layout subviews
  • view appear
  • view disappear

四个阶段

自此页面显示在了屏幕上。

总结

从main->view的这个阶段中,主要涉及到了Application的生命周期转换以及View Controller的生命周期转换,不同的状态对应不同的生命周期函数。结合之前的从编译到运行,iOS中一个app的启动流程完备了。

CATALOG
  1. 1. iOS 程序启动流程
    1. 1.1. main
    2. 1.2. 界面
    3. 1.3. 总结