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

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

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:]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容