点击app的icon之后发生了什么

app的启动分为pre-main()main()两个阶段,本篇文章主要介绍main()函数发生了什么。

点击app的icon之后发生了什么_第1张图片
app_launch_fg.png

main()函数阶段

每个C语言程序都是从main()函数开始的,Objective-C的程序也不例外。创建完新的iOS工程之后,系统会默认为我们创建一个main.m文件。main.m的代码一般如下:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

main()函数中只调用了一个函数UIApplicationMain(),接下来介绍一下UIApplicationMain()函数。

UIApplicationMain()函数

/**
 创建application及其代理,创建事件循环

 @param argc argv中参数的数量
 @param argv 参数的列表
 @param principalClassName UIApplication类名或其子类名,nil默认为UIApplication
 @param delegateClassName application delegate的类名,如果从nib文件加载代理,则设为nil(不太理解)
 @return Never Return
 */
int UIApplicationMain(int argc, char * _Nonnull *argv, NSString *principalClassName, NSString *delegateClassName);

看一下UIApplicationMain()的官方文档:

This function instantiates the application object from the principal class and instantiates the delegate (if any) from the given class and sets the delegate for the application. It also sets up the main event loop, including the application’s run loop, and begins processing events. If the application’s Info.plist file specifies a main nib file to be loaded, by including the NSMainNibFile key and a valid nib file name for the value, this function loads that nib file.
Despite the declared return type, this function never returns.

由此可知,UIApplicationMain()主要做了以下事情:

  • 首先,创建UIApplication的单例。每一个iOS应用只有一个UIApplication对象,application主要负责用户事件的分发,它内部维护了一个开放的window对象的列表,可以通过这个列表追溯到app的任何一个view。如果必须要在系统之前处理用户事件,可以继承UIApplication并且重写sendEvent:sendAction:to:from:forEvent:方法。
  • 接着,根据传入的类名创建代理对象(也是单例),并且设置为UIApplication单例的代理。代理遵守UIApplicationDelegate协议,对app的生命周期的重要事件做出响应,例如app的初始化,app状态的切换和恢复,系统事件等。
  • 然后,创建主事件循环(包含application所需要用到的run loop),保证程序不退出,开始处理事件。
  • 最后,如果info.plist中设置了NSMainNibFile并且对应的值有效,则会加载对应的nib文件。

UIApplicationDelegate

UIApplicationMain()函数在完成上述的主要事情之后,会进行第一次初始化,此时会回调UIApplicationDelegateapplication:willFinishLaunchingWithOptions:方法,这是开发者能够编写自定义代码的第一个地方。
接下来会恢复UI状态,然后是最终的初始化,此时会回调UIApplicationDelegateapplication:didFinishLaunchingWithOptions:方法,在这个方法中设置keyWindow,并且创建根控制器。
以下为新建的空工程UIApplicationDelegate方法的执行顺序:

  • 启动程序
2018-06-14 02:40:17.954918+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate application:willFinishLaunchingWithOptions:]
2018-06-14 02:40:17.955391+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate application:didFinishLaunchingWithOptions:]
2018-06-14 02:40:17.968420+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationDidBecomeActive:]
  • 按Home键
2018-06-14 02:42:55.144510+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationWillResignActive:]
2018-06-14 02:42:55.726878+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationDidEnterBackground:]
  • 再次点击icon
2018-06-14 02:43:34.248368+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationWillEnterForeground:]
2018-06-14 02:43:34.533594+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationDidBecomeActive:]

你可能感兴趣的:(点击app的icon之后发生了什么)