天天看点

iOS的程序启动原理

大家在写iOS程序的过程中一般是通过向导,生成项目,然后通过模拟器启动应用程序。但我们肯定会对它背后的启动过程感到好奇,比如点击程序图标启动程序开始到退出程序整个程序运行过程中底层到底做了什么?

一、程序启动原理

1.

首先找到程序入口,执行main函数

main -> UIApplicationMain

2.

UIApplicationMain底层做事情

1> 创建UIApplication对象

2> 创建UIApplication的代理对象,而且给UIApplication对象代理属性赋值

3> 开启主运行循环,作用接收事件,让程序一直运行

4> 加载info.plist,判断下有木有指定main.storyboard,如果指定就会去加载

3.创建UIWindow

1> 加载info.plist,判断有没有指定main.storyboard,指定了main.storyboard,就会去加载main.storyboard,执行main.storyboard的时候创建窗口,加载控制器,设置窗口的根控制器,显示窗口。

2> 在加载info.plist文件之后,如果没有指定main.storyboard,会在程序启动完成的时候创建窗口。 (

手动创建窗口

1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // 窗口显示的注意点:
 3     // 1.一定要强引用
 4     // 2.控件要想显示出来,必须要有尺寸
 5 
 6     // 1.创建窗口
 7     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
 8 
 9     // 2.创建根控制器,在设置窗口的根控制器
10     UIViewController *vc = [[UIViewController alloc] init];
11 
12     // 设置窗口的根控制器,底层会自动把根控制器的view添加到窗口上,并且让控制器的view有旋转功能
13     self.window.rootViewController = vc;
14 
15     // 3.显示窗口
16     // makeKeyAndVisible:让窗口成为应用程序的主窗口,并且显示窗口
17     [self.window makeKeyAndVisible];
18 
19     return YES;
20 }      

程序启动官方文档:

二、UIApplication

1> UIApplication对象是应用程序的象征

2> 每一个应用都有自己的UIApplication对象,而且是单例的。通过[UIApplication sharedApplication]可以获得这个单例对象。

3> 一个iOS程序启动后创建的第一个对象就是UIApplication对象

4> 利用UIApplication对象,能进行一些应用级别的操作

1.应用程序图片的提醒数字

1    // 获取应用程序的象征
 2    UIApplication *app =  [UIApplication sharedApplication];
 3 
 4     // 应用程序图片的提醒数字
 5     app.applicationIconBadgeNumber = 100;
 6 
 7     // 创建通知对象
 8     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
 9     // 注册用户通知
10     [app registerUserNotificationSettings:settings];      

2.联网状态

1     // 联网状态
2     app.networkActivityIndicatorVisible = YES;      

3.打开资源,电话,网页,发短信

1 // 打开网页
2 NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
3 [app openURL:url];      

4.设置状态栏

 在iOS7之后,状态栏默认交给控制器处理

1 // 状态栏的隐藏
 2 - (BOOL)prefersStatusBarHidden
 3 {
 4     return YES;
 5 }
 6 // 状态栏的样式
 7 - (UIStatusBarStyle)preferredStatusBarStyle
 8 {
 9     return UIStatusBarStyleLightContent;
10 }      

那么在iOS7之后如何设置

用UIApplication对象管理状态栏:

(在info.plist中添加一个字典View controller-based status bar appearance = NO)

使用UIApplication对象管理状态栏的好处:  1.统一管理.(控制器很多的情况下用控制器不好管理)

//    app.statusBarHidden = YES;      

 2. 隐藏状态栏可以设置动画

1   [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];      

三、UIApplication的代理

1.在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件

2.delegate可处理的事件包括:

2.1应用程序的生命周期事件(如程序启动和关闭)

2.2系统事件(如来电)

2.3内存警告

3.delegate什么时候调用:

1 // app启动完成的时候调用
 2 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 3 
 4     NSLog(@"%s",__func__);
 5 
 6     return YES;
 7 }
 8 
 9 // app即将失去焦点的时候调用
10 - (void)applicationWillResignActive:(UIApplication *)application {
11     NSLog(@"%s",__func__);
12 }
13 
14 // app进入后台
15 - (void)applicationDidEnterBackground:(UIApplication *)application {
16    NSLog(@"%s",__func__);
17     // 保存一些数据
18 }
19 
20 // app即将进入前台的时候调用
21 - (void)applicationWillEnterForeground:(UIApplication *)application {
22     NSLog(@"%s",__func__);
23 }
24 
25 // app即将获取焦点的时候
26 // 当应用程序获取焦点的时候才能够与用户交互
27 - (void)applicationDidBecomeActive:(UIApplication *)application {
28     NSLog(@"%s",__func__);
29 }
30 
31 // app关闭的时候调用
32 - (void)applicationWillTerminate:(UIApplication *)application {
33 
34 }
35 
36 // 监听内存警告
37 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
38 {
39     NSLog(@"内存警告");
40     // 清楚图片缓存
41 }      

四、iOS启动过程逻辑回顾

---恢复内容结束---