UIApplication和delegate代理

所有的移动操作系统都有个致命的缺点: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 为箭头所指向的控制器
* 显示窗口

原文地址:https://www.cnblogs.com/syios/p/4774914.html