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

UIApplication和delegate代理的更多相关文章

  1. iOS开发之UIApplication和delegate

    1.概述 所有的移动操作系统都有个致命的缺点:app很容易受到打扰.比如一个来电或者锁屏会导致app进入后台甚至被终止. 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统 ...

  2. 【iOS [[UIApplication sharedApplication] delegate]】运用

    之前想要拿到app的窗口,我们通常的写法是: [UIApplication sharedApplication].keyWindow 这种写法之前一直也觉得是正确的,没什么问题,而且网上大多数的博客或 ...

  3. iOS阶段学习第30天笔记( UIViewController—Delegate(代理) )

    iOS学习(UI)知识点整理 一.UIViewController的介绍 1)概念:UIViewController 即视图控制器,用来管理和控制页面跳转的一个类 ,iOS里面采用了MVC的体系结构, ...

  4. Delegate(代理)异常:该委托必须有一个目标

    转自 Delegate(代理)异常:该委托必须有一个目标 在代理调用BeginInvoke(new AsyncCallback(callBack), null);时,会抛这个异常的原因是该代理变量代理 ...

  5. OC中APPDelegate[[UIApplication shareApplication]delegate]]Swift实现

    直接上代码: var myDelegate:AppDelegate? myDelegate = UIApplication.sharedApplication().delegate as? AppDe ...

  6. [UIApplication sharedApplication].keyWindow和[[UIApplication sharedApplication].delegate window]区别

    参考链接:https://www.cnblogs.com/henusyj-1314/p/11643189.html 结论1.在获取到window时最好使用[[UIApplication sharedA ...

  7. View 与 Controller 之间的delegate(代理)传值

    这个代理传值是经常使用的一种传值方式,下面介绍一种View 和 Controller 之间的代理传值方法. 先建立一个View视图 如 LoginView 是继承于一个UIView 在LoginVie ...

  8. 关于delegate(代理)总结

    stackoverflow  上讲解:http://stackoverflow.com/a/12660523/4563358 delegate是将需要处理交给自己的代理. 在自己的对应的类中.h文件中 ...

  9. Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)

    需求:在ViewController中,点击Button,push到下一个页面NextViewController,在NextViewController的输入框TextField中输入一串字符,返回 ...

随机推荐

  1. C#代码像QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法

    你QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法: 要么重写需要弹出的窗体的事件: protected override CreateParams ...

  2. (ETW) Event Tracing for Windows 入门 (含pdf下载)

    内容提纲 • ETW 介绍 • ETW 使用 • ETW 监控本机Demo • ETW 监控远程机器的思路 • 底层类库:EventSource 介绍 • 底层类库:TraceEvent 介绍 ETW ...

  3. db2 表授权语句

    grant insert/update/delete on table schema.table_name to user user_name;

  4. Objective-c中定义成员变量

    ios定义成员变量的方法: 如果只是内部访问,完全可以直接用_xxx(下划线),无需自己定义,编译器会自动生成 如果需要外部访问这个变量,可以用 @property xxx ; @synthesize ...

  5. 常用天气预报API接口整理(转)

    文章转自:http://www.nohacks.cn/post-35.html 自序: 由nohacks.cn 收集整理,来源于网络,版权归原作者所有,基本收集了网络上能使用的大部分天气API接口,作 ...

  6. word2007二级标题自动编号不从大标题开始的解决方法

    今天在编写word文档的时候,遇到一个很奇怪的问题,word2007二级标题自动编号不从大标题开始,可能我说的比较模糊,我截个图大家一看就明白了. 我想要的是2.1 2.2结果,他确是从1.1开始了. ...

  7. SecureCRT的快捷键

    快捷键,有时比笨拙的方式,要效率高很多,近期经常和Linux打交道,用到SecureCRT,这里就从网上找到部分快捷方式,作为日后查看,以防经常查找. Alt + Enter -- 全屏Alt + B ...

  8. Java 反射练习

    已同步更新至个人blog:http://dxjia.cn/2015/08/java-reflect/ 引用baidubaike上对JAVA反射的说明,如下:JAVA反射机制是在运行状态中,对于任意一个 ...

  9. 同时大量连接导致的DDOS攻击,导致收发器宕机,用户大面积超时掉线

    前段时间一个客户改成电信网通自动路由后(当然和这个没有关系,但是客户一般没有分析能力,会多想),用户经常大面积掉线,用户才180多个,在线最多也才120多,十分苦恼,原先帮其维护的技术人员,只是远程诊 ...

  10. Java模式(适配器模式)【转载】

    转载地址: http://blog.csdn.net/elegant_shadow/article/details/5006175 今天看了下Java中的适配器模式,以下就来小做下总结和谈谈感想,以便 ...