前言
每一个应用程序都有一个 UIApplication 或其子类型的实例。当程序被加载,函数方法 UIApplicationMain 就被调用执行,它创建了单件模式的 UIApplication对象。这篇博客会主要写写我对 UIApplication 的了解。
什么是 UIApplication
我是这么简单的概括 UIApplication 的:
UIApplication 对象是与我们的应用程序一一对应的。
UIApplication 在运用程序中是以 单例 的形式存在。
iOS 程序启动第一个创建的对象就是 UIApplication。
我们常常会利用 UIApplication 来做一些应用级别的操作。
从 UIApplication 的创建开始说起
程序的运行往往会起始于 main 函数,iOS 也不例外。在我们的工程文件目录底下会 mian.m
文件:
1 | // |
这个默认的iOS程序就是从 main 函数开始执行的,但是在main函数中我们其实只能看到一个方法,这个方法内部是一个消息循环(相当于一个死循环),因此运行到这个方法 UIApplicationMain 之后程序不会自动退出,而只有当用户手动关闭程序这个循环才结束。这个方法有四个参数:
第一个参数和第二个参数其实就是main函数的参数,分别代表:参数个数、参数内容;
第三个参数代表UIApplication类(或子类)字符串,这个参数默认为nil则代表默认为UIApplication类,用户可以自定义一个类继承于这个类;如果为nil则等价于NSStringFromClass([UIApplication class]),大家可以自己试验,效果完全一样;
第四个参数是UIApplication的代理类字符串,默认生成的是AppDelegate类,这个类主要用于监听整个应用程序生命周期的各个事件,当UIApplication运行过程中引发了某个事件之后会调用代理中对应的方法;
也就是说当执行 UIApplicationMain 方法后这个方法会根据第三个参数创建对应的 UIApplication 对象,这个对象会根据第四个参数 AppDelegate 创建并指定此对象为UIApplication的代理;同时UIApplication会开启一个消息循环不断监听应用程序的各个活动,当应用程序生命周期发生改变 UIApplication 就会调用代理对应的方法。
这就是 UIApplication 诞生的地方啦~
UIApplication 的使用
由于 UIApplication 是单例模式,所以我们不能和使用正常的类一样去 alloc、init 它,只能通过以下的方法对它进行调用:
1 | // |
常用有以下属性:
- delegate 属性获取UIApplicationDelegate实现类的实例
- windows 属性获取当前程序涉及到窗口类数组
- keyWindow 属性获取当前程序关键窗口
可以做的应用级的操作有哪些
在官方文档中,我们可以知道, UIApplication 能做的事情还是很多的,像我们会经常使用的:
1.设置icon上的数字图标
1 | //设置主界面icon上的数字图标 |
2.判断程序运行状态
1 | //判断程序运行状态 |
3.阻止屏幕变暗进入休眠状态
1 | //阻止屏幕变暗,缺省为no, 慎重使用本功能,因为非常耗电。 |
4.显示联网状态
1 | //显示联网标记 |
5.发送电子邮件
1 | NSString *recipients = @"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!"; |
6.打电话到一个号码
1 | // Call Google 411 |
7.发送短信
1 | // Text to Google SMS |
8.打开一个网址1
2
3// Lanuch any iPhone developers fav site
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];
UIApplication Delegate
上面我们也提及了 AppDelegate,在项目底下我们会看到 AppDelegate 的类,它就是 UIApplication 的代理。 AppDelegate 默认已经遵守了 UIApplicationDelegate 协议,已经是 UIApplication 的代理。
这个类中定义了应用程序生命周期中各个事件的执行方法:
1 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; |
程序启动完整过程
前面讲了很多关于程序启动与初始化的东西,那也就顺带提一下,有关程序启动的完整过程,我大概画了一下:
后记
最近在实习中陆陆续续的修复了一些bug,get 到了不少知识点,过几天有机会可以整理成笔记分享出来~今天就到这了!买了预售的电影票~期待周末快快到来!