iOS程序的生命周期
任何程序的生命周期都是指程序加载到程序结束这一段时间。
在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程序的生命周期的更多相关文章
- 2. iOS程序的生命周期
程序启动-生命周期 来自: QQ: 853740091 1.首先讲解UIApplication对象 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个 ...
- [ios基础]IOS应用程序的生命周期问题
—程序的生命周期 a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程 b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...
- 浅析 - iOS应用程序的生命周期
1.应用程序的状态 状态如下: Not running 未运行 程序没启动 Inactive 未激活 程序在前台运行,不过没有接收到事件.在没有事件处理情况下程序通 ...
- iOS 应用程序的生命周期
iOS 应用程序的生命周期(网络资源总结) http://blog.csdn.net/totogo2010/article/details/8048652 http://www.cocoachina. ...
- [转]iOS 应用程序的生命周期
OS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到 ...
- [转载] iOS应用程序的生命周期
iOS应用程序的生命周期 2015-06-23 iOS大全 (点击上方蓝字,快速关注我们) iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些 ...
- iOS开发-程序的生命周期
为了更好的管理程序,了解程序的生命周期是很有必要的. 运行结果: 1.首次启动: 2015-05-26 17:33:28.362 Live[4858:214241] 程序开始 2015-05-26 1 ...
- 微信小程序之生命周期(三)
[未经作者本人同意,请勿以任何形式转载] 上一篇介绍微信小程序开发工具使用和项目目录结构. 这一章节介绍微信小程序的生命周期,什么是生命周期呢? 通俗的讲,生命周期就是指一个对象的生老病死. 从软件的 ...
- UI1_应用的程序的生命周期
// // AppDelegate.m // UI1_应用的程序的生命周期 // // Created by zhangxueming on 15/6/29. // Copyright (c) 201 ...
随机推荐
- Linux下的Libsvm使用历程录
原文:http://blog.csdn.net/meredith_leaf/article/details/6714144 Linux下的Libsvm使用历程录 首先下载Libsvm.Python和G ...
- 基于html5实现的愤怒的小鸟网页游戏
之前给大家分享一款基于html5 canvas和js实现的水果忍者网页版,今天给大家分享一款基于html5实现的愤怒的小鸟网页游戏.这款游戏适用浏览器:360.FireFox.Chrome.Safar ...
- 基于jQuery的美食时间轴焦点图插件
这是一款非常炫酷的jQuery焦点图插件,这款jQuery焦点图的特点是有一个时间轴,点击切换按钮时,时间轴会逐渐移动,时间轴上的图片也会逐渐切换.另外,在图片上方也可以放置自定义样式的文字. 在线预 ...
- PHP经验——PHPDoc PHP注释的标准文档(翻译自Wiki)
文档注释,无非“//”和“/**/”两种 ,自己写代码,就那么点,适当写几句就好了:但是一个人总有融入团队的一天,团队的交流不是那几句注释和一张嘴能解决的,还需要通用的注释标准. PHPDoc是PHP ...
- 解决python3 不能引入setuptools
1,原理分析: python中的setuptools因为其安全考虑需要ssl模块的支持.如果编译时没有通过ssl测试,就不能安装setuptools. 所以才会出现 Python3/dist-pack ...
- PHP7安装问题解决
ext/standard/info.o: In function `php_info_print_request_uri’: /root/php-5.4.16/ext/standard/info.c: ...
- 使用Thread类可以创建和控制线程
1.创建线程 static void Main(string[] args) { /* Thread类 * 创建控制线程 * 其构造函数接受ThreadStart和ParameterizedThrea ...
- 互联网时代的社会语言学:基于SNS的文本数据挖掘
今年上半年,我在人人网实习了一段时间,期间得到了很多宝贵的数据,并做了一些还算有意义的事情,在这里和大家一块儿分享.感谢人人网提供的数据 与工作环境,感谢赵继承博士.詹卫东老师的支持和建议.在这项工作 ...
- 通用链表实现(参考Linux List)
最近参考Linux实现的通用双向链表时,因typeof并不是标准c规定的关键字,除GCC编译器外其他编译器未必支持typeof关键字,所以在使用上并不能想Linux所实现的链表哪样灵活,它要求将连接器 ...
- (五)u-boot2013.01.01 for TQ210:《移植前的准备及u-boot初编译》
移植前的准备 移植前,要做的事情是搭建开发环境以及对U-boot源码的获取.首先说一下开发环境: 1.此次U-boot移植的硬件平台是天嵌的TQ210开发板: CPU:板载核心是S5PV210(Cor ...