所有的移动操作系统都有个致命的缺点:app很容易受到打扰,比如一个来电或者锁屏都会导致app进入后台甚至被终止
还有很多其他类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这是UIApplication会通知他的delegate对象 让delegate对象来处理这些系统事件
常用的代理方法
@implementation AppDelegate /** * 程序启动完毕就会调用 */ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } /** * 程序将要失去焦点的时候调用 */ - (void)applicationWillResignActive:(UIApplication *)application { } /** * 程序进入后台的时候就会调用 一般在这里保存应用数据 */ - (void)applicationDidEnterBackground:(UIApplication *)application { } /** * 程序进入前台就会调用 */ - (void)applicationWillEnterForeground:(UIApplication *)application { } /** * 程序接收到内存警告时调用 一般在这里清楚不需要再使用的内存 */ - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { } /** * 被激活 获取到焦点的时候调用 */ - (void)applicationDidBecomeActive:(UIApplication *)application { } @end
delegate:可以处理的系统事件包括:
- 应用程序的生命周期事件 比如程序的启动和关闭
- 系统事件 比如来电
- 内存警告
应用程序一启动首先创建的第一个对象就是UIApplication
UIApplication是应用程序的象征 当我们创建一个项目时:系统已经帮我自动创建了代理 :AppDelegate
应用程序的启动过程:
探究UIApplicationMain
main函数中执⾏行了⼀一个UIApplicationMain这个函数 • int UIApplicationMain(int argc, char *argv[], NSString
- principalClassName, NSString *delegateClassName); ➢ argc、argv:直接传递给UIApplicationMain进⾏行相关处理即可
- principalClassName:指定应⽤用程序类名(app的象征),该类必须是UIApplication(或 ⼦子类)。如果为nil,则⽤用UIApplication类作为默认值
- delegateClassName:指定应⽤用程序的代理类,该类必须遵守UIApplicationDelegate协 议
- UIApplicationMain函数会根据principalClassName创建UIApplication对象,根 据delegateClassName创建⼀一个delegate对象,并将该delegate对象赋值给UIApplication对 象中的delegate属性
- 接着会建⽴立应⽤用程序的Main Runloop(事件循环),进⾏行事件的处理(⾸首先会在程序完毕后调 ⽤用delegate对象的application:didFinishLaunchingWithOptions:⽅方法)
- 程序正常退出时UIApplicationMain函数才返回
UIWindow
- UIWindow是一种特殊的UIView通常在一个app中只会有一个UIWindow
- ios程序启动完毕后 创建的第一个视图控件就是UIWindow,接着创建控制器View,最后将控制器的view添加到UIWindow上面 于是控制器的view就显示在屏幕上了
- 一个IOS程序之所以能显示 完全是因为它有UIWindow
- 也就是说没有UIWindow 就看不见任何UI界面
程序启动的完整过程
1.main函数
2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
3.delegate对象开始处理(监听)系统事件(以前没有storyboard的情况)
* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
* 创建UIWindow
* 创建和设置UIWindow的rootViewController 为箭头所指向的控制器
* 显示窗口