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

  在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. Windows 7 IIS HTTP 错误 500.21 – Internal Server Error 解决方法

    错误状况: 下面内容来自网络,自己也另有补充 原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决办法:开始->所有程序->附件->鼠 ...

  2. 【Android 界面效果25】android中include标签的使用

    在一个项目中我们可能会需要用到相同的布局设计,如果都写在一个xml文件中,代码显得很冗余,并且可读性也很差,所以我们可以把相同布局的代码单独写成一个模块,然后用到的时候可以通过<include ...

  3. Swift - 使用NSNotificationCenter发送通知,接收通知

    转载自:http://www.mamicode.com/info-detail-1069228.html 标签: 1,通知(NSNotification)介绍 这里所说的通知不是指发给用户看的通知消息 ...

  4. Hosts文件是什么?

    Hosts文件主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定.可以用文本文件打开!当用户在浏览器中输入一个需要登录的 网址时,系统会首先自动从Hosts文件中寻找对应的IP ...

  5. ajax 请求

    案例: <html><head><script type="text/javascript">function loadXMLDoc(){var ...

  6. 【AR】Vuforia App key is missing.Please get a valid key

    在跑Vuforia 的sample android app 的时候报了下面这个错,找了半天才找到解决方法: "Vuforia App key is missing. Please get a ...

  7. [freemarker篇]04.简单介绍-基本数据类型

    好几天没有更新博客了,最近一顿乱七八糟的忙!今天简单更新第四章,这里只能说是简单介绍,因为权威的还是需要看Freemarker的官方中文手册! 好几天没有更新博客了,最近一顿乱七八糟的忙!今天简单更新 ...

  8. Linux勉強

        block 與 inode 的總量: 未使用與已使用的 inode / block 數量: block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128 by ...

  9. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  10. HDU1358:Period

    第一次做KMP.还没有理解透. 在自己写一遍时没有让next[0]初始化为-1. 还有就是next应该是c++中的关键字,提交后编译错误. From: http://blog.csdn.net/lib ...