移动操作系统有个致命弱点,是app容易受到干扰(来电或者锁屏)。

当app受到干扰时,会产生一系列的系统事件,这时UIApplication会通知其delegate对象,让delegate处理系统事件。

delegate可以处理生命周期事件、系统事件、内存警告等。

ApplicationDelegate已经遵循了UIApplicationDelegate协议,直接在ApplicationDelegate的实现中写代码即可应对各种app的干扰。

常用的是:

application: didFinishLaunchingWithOptions:   自程序启动第一次加载完毕后就调用

applicationDidEnterBackground:                       进入后台时调用

applicationDidEnterForeground:                       进入前台时调用

applicationDidReceiveMemoryWarning:           内存警告时调用

注意,其中的BecomeActive和ResignActive指的是获得和失去焦点。

程序执行步骤:入口为main.m,然后执行UIApplicationMain(类似一个死循环)直到返回。

int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

UIApplicationMain会初始化UIApplication,创建和设置代理对象,并开启事件循环。

当队列不空时,会不断从队列中取出队头事件来处理。如果监听到系统事件,就会去调用代理方法。

UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

前两个参数是从main()得到的命令行参数;第三个参数是最主要的类名,一般是UIApplication的类名,写nil以UIApplication为默认值;

第四个参数为UIApplication的代理,必须遵循UIApplicationDelegate协议。

NSStringFromClass方法,写[<#类名#> class] 作为参数即可实现将类名转字符串,可以降低出错率。

UIWindow是一种特殊的UIView,通常情况下在一个app中只有一个UIWindow。

iOS程序启动后,创建的第一个视图控件是UIWindow,接着把view添加到UIWindow上。

Tip:没有UIWindow就没有UI界面,

底层的操作是:初始化一个要显示的View,然后通过UIWindow的addSuberview方法加入到Window上,只有UIWindow调用makeKeyAndVisible才能显示。

建议通过self.window的rootViewController属性来设置控制器,因为直接添加Suberview得不到控制器信息,那么视图改变(例如屏幕旋转)时无法调用控制器。

结构层次:

Tip:要显示哪个窗口,就让UIWindow的控制器为哪个UIView。

使用storyboard会屏蔽UIView添加到UIWindow的过程,并且会让箭头指向的控制器作为rootViewController,最后这个window会作为ApplicationDelegate的一个成员变量。

Mainstoryboard的加载步骤:

初始化一个window->加载initial view->将这个view配置到window的rootViewController。

(三十三)UIApplicationDelegate和程序的启动过程的更多相关文章

  1. iOS程序的启动过程介绍

    大家在学习iPhone开发时候,都会写HelloWorld程序.大家一般都是通过向导,生成项目,然后通过模拟器启动应用程序.但是大家知道其背后的启动过程吗?也就是当点击程序图标启动程序开始到退出程序整 ...

  2. Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法

    Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...

  3. Android应用程序进程启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...

  4. MFC程序的启动过程——先全局对象theApp(第一入口),后WinMain(真正入口),会引爆pApp->InitInstance从而创建窗口(程序员入口)

    原文出自:http://blog.csdn.net/yuvmen/article/details/5877271 了解MFC程序的启动过程,对于初学者来讲,了学习MFC很有帮助:对于不常用VC的人来说 ...

  5. Android应用程序进程启动过程(后篇)

    前言 在前篇中我们讲到了Android应用程序进程启动过程,这一篇我们来讲遗留的知识点:在应用程序进程创建过程中会启动Binder线程池以及在应用程序进程启动后会创建消息循环. 1.Binder线程池 ...

  6. Android应用程序进程启动过程(前篇)

    在此前我讲过Android系统的启动流程,系统启动后,我们就比较关心应用程序是如何启动的,这一篇我们来一起学习Android7.0 应用程序进程启动过程,需要注意的是“应用程序进程启动过程”,而不是应 ...

  7. iOS程序的启动过程-UIWindow

    UIApplicationMain main函数中执行了一个UIApplicationMain这个函数 int UIApplicationMain(int argc, char *argv[], NS ...

  8. Nimbus<三>Storm源码分析--Nimbus启动过程

    Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype="-serv ...

  9. iPhone应用程序的启动过程

    Phone的入口函数main,这之后它有是怎样启动应用程序,初始化的呢,这些都是通过 UIApplicationMain 来实现的. 其启动的流程图大致如下图所示: 1 int retVal = UI ...

随机推荐

  1. FJUT寒假第一周作业浮点数查寻题解

    二分强化——浮点数序列查询 TimeLimit:4000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description ...

  2. Django的配置文件(settings)

    静态文件设置: 一.概述: #静态文件交由Web服务器处理,Django本身不处理静态文件.简单的处理逻辑如下(以nginx为例): # URI请求-----> 按照Web服务器里面的配置规则先 ...

  3. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04

    Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...

  4. VBA find方法

    Sub Sample() Dim sfzs As New Collection Dim ws, wbs, dbs As Worksheet Dim r As Long Set ws = ThisWor ...

  5. python 列表解析与map和filter函数

    不知哪儿看到一个说法,大概是当map的函数参数可以直接引用一个已有的函数变量时(比如内建函数int,str之类的),用map更优美些,否则还是用列表解析更直观和快速. 我同意此说法. 昨天在写一个函数 ...

  6. Spark技术内幕:Shuffle Pluggable框架详解,你怎么开发自己的Shuffle Service?

    首先介绍一下需要实现的接口.框架的类图如图所示(今天CSDN抽风,竟然上传不了图片.如果需要实现新的Shuffle机制,那么需要实现这些接口. 1.1.1  org.apache.spark.shuf ...

  7. 将String转换为其表示的路径画到屏幕上

    关于这个问题,我已经在另一篇blog中有所提及: CoreText精彩文字轮廓绘制动画的一点改进 不过原有的转换代码使用Obj-C写的,在这里我们尝试将其转换为Swift语言,然后利用它实现一个测试小 ...

  8. [python]mysql数据缓存到redis中 取出时候编码问题

    描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...

  9. springMVC源码分析--DispatcherServlet请求获取及处理

    在之前的博客springMVC源码分析--容器初始化(二)DispatcherServlet中我们介绍过DispatcherServlet,是在容器初始化过程中出现的,我们之前也说过Dispatche ...

  10. EJB3+JBoss5+Myeclipse9创建HelloWorld实例

    本实例用到的工具 1. jboss5 (配置不做介绍,谷歌度娘都有) 2. MyEclipse 9 实例创建 1.EJB类创建 打开MyEclipse 9 中右上角如下选项  再新建一个EJB项目 新 ...