任何程序的生命周期都是指程序加载到程序结束这一段时间。

  在iOS应用程序中,通过单击主页面上的图标的方式可以启动一个程序。单击后,系统会显示一个过渡界面,然后调用main()函数来加载程序。从这一刻开始,大量的初始化工作都交给了UIKit,它负责加载程序的用户界面并启动事件循环。在事件循环过程中,UIKit将传入的事件和自定义对象相关联,并响应程序的命令事件。如果用户的某个操作引起了程序的退出,UIKit会通知程序并开始结束程序的过程。

  在iOS程序中,很少使用main()函数,绝大多数实际的工作都交给UIApplicationMain()函数来处理。因此,当我们在Xcode中使用模板新建一个工程时,生成的main()函数内容几乎都是一样的。

 #import <UIKit/UIKit.h>
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [ [NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil) ;
[pool release];
return retVal;
}

main()函数主要完成如下3个工作:

(1) 创建一个自动释放池;

(2) 调用UIApplicationMain()函数;

(3) 释放自动释放池。

  一般来说,开发者不需要修改main()函数。

  函数UIApplicationMain()是初始化程序的核心,它接受4个参数,并且建议开发者永远不要修改传入的这4个参数。其中,argc和argv两个参数来自于main()函数的参数;另外两个String类型参数分别表示程序的主要类(principal class)和代理类(delegate class)。如果主要类为nil,则默认为UIApplication;如果代理类为nil,则假设程序的代理来自Main nib文件。如果这两个参数任意一个不为nil,那么UIApplicationMain()函数就会根据参数创建相应的功能类。因此,如果程序中使用自定义的UIApplication类的子类(不建议继承UIApplication类建立自定义子类),你需要将你的自定义类名称作为第3个参数传进来。

  每个iOS应用程序都包含一个UIApplication对象,iOS系统通过该对象监控应用程序生命周期全过程。每个应用程序都要为UIApplication对象指定一个代理对象,并由改代理对象处理UIApplication对象监测到到应用程序生命周期事件。作为UIApplication的代理类,必须要首先实现UIApplicationDelegate协议,协议里面明确了作为代理应该做或者可以做哪些事情。UIApplication对象负责监听应用程序的生命周期事件,并将事件交给代理对象处理。通常来说,一个iOS应用程序拥有如下5种状态:

(1) Not running

  应用程序还没有启动,或者应用正在运行但是途中被系统停止。

(2) Inactive

  当前应用程序正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些事件(例如来电、有未读短信等)的时候。

(3) Active

  当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。

(4) Background

  应用处在后台,并且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。然而,对于请求需要额外的执行时间的应用,会在此状态保持更长的一段时间。另外,如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not running状态进入Background状态,中途不会经过Inactive状态(比如没有界面的应用)。注意:此处并不是特指没有界面的应用,即使有界面,如果要直接进入Background状态的话,该应用界面也不会被显示。

(5) Suspended

  应用处在后台,并且已经停止执行代码。系统自动将应用移入此状态,且在此举之前不会对应用做任何通知。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统会将处于Suspended状态的应用清出内存,以便为正在前台运行的应用提供足够的内存。

参考资料:《iOS 8开发指南》 管蕾 人民邮电出版社。

iOS程序的生命周期的更多相关文章

  1. 2. iOS程序的生命周期

    程序启动-生命周期 来自:  QQ: 853740091 1.首先讲解UIApplication对象 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个 ...

  2. [ios基础]IOS应用程序的生命周期问题

    —程序的生命周期         a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程         b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...

  3. 浅析 - iOS应用程序的生命周期

    1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到事件.在没有事件处理情况下程序通 ...

  4. iOS 应用程序的生命周期

    iOS 应用程序的生命周期(网络资源总结) http://blog.csdn.net/totogo2010/article/details/8048652 http://www.cocoachina. ...

  5. [转]iOS 应用程序的生命周期

    OS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到 ...

  6. [转载] iOS应用程序的生命周期

    iOS应用程序的生命周期 2015-06-23 iOS大全 (点击上方蓝字,快速关注我们) iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些 ...

  7. iOS开发-程序的生命周期

    为了更好的管理程序,了解程序的生命周期是很有必要的. 运行结果: 1.首次启动: 2015-05-26 17:33:28.362 Live[4858:214241] 程序开始 2015-05-26 1 ...

  8. 微信小程序之生命周期(三)

    [未经作者本人同意,请勿以任何形式转载] 上一篇介绍微信小程序开发工具使用和项目目录结构. 这一章节介绍微信小程序的生命周期,什么是生命周期呢? 通俗的讲,生命周期就是指一个对象的生老病死. 从软件的 ...

  9. UI1_应用的程序的生命周期

    // // AppDelegate.m // UI1_应用的程序的生命周期 // // Created by zhangxueming on 15/6/29. // Copyright (c) 201 ...

随机推荐

  1. Lambdas in Java 8--reference

    Part 1 reference:http://jaxenter.com/lambdas-in-java-8-part-1-49700.html Get to know lambda expressi ...

  2. 分布式缓存技术redis学习(二)——详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

  3. Drawable和Bitmap转换

    一.Bitmap转Drawable Bitmap mBitMap=getYourBitMap(); //getYourBitMap()是你获取BitMap的方法 BitmapDrawable mBit ...

  4. Joynet示例:知乎爬虫(搜索关键字相关回答,并下载其中的---图(mei)片(nv))

    先贴爬虫程序下载地址:http://pan.baidu.com/s/1c2lxl1e 下载解压后 可直接运行 其中的 run.bat:或者你手动打开命令行执行:Joynet examples\Spid ...

  5. DataContractJsonSerializer和JavaScriptSerializer内部实现差异

    定义一个下面这样的类,此类有Serializable属性,并且有一个属性的定义没有使用自动属性来实现. [Serializable] public class Users { public int U ...

  6. Android 珍藏(二)

    一.如何控制Android  LED等?(设置NotificationManager的一些参数) 代码如下: final int ID_LED=19871103; NotificationManage ...

  7. oracle lsnrctl

    Oracle 11G在windows 7系统上不需要设置系统环境变量. 在命令行环境中运行命令: echo %ORACLE_SID% 可以看到此变量并不存在.也可以到注册表验证: HKEY_CURRE ...

  8. Markdown Test

    P1 1.1 interview 1.2 invoker show 1.3 Wtf? P2 for example this is a story int main() { printf(" ...

  9. hdu1880

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. 安装sybase12.0,运行时报错异常。

    报错为:invalid command line argument ' and' 当通过开始菜单打开"配置服务器"时,回报如上异常,当继续创建服务器是,不会成功.实际上不是程序出错 ...