iOS APP 生命周期

 

官方文档:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW1

基本要点:

一 入口函数为main函数,一般不需要更改;

发散点:看main函数,可以注意到加上了@autoreleasepool. 实际上如果在启动子线程的时候,也需要作类似处理,以保证放入auto release pool的对象能被及时释放.

二 The Main Run Loop 主运行循环

Main Run Loop负责处理用户相关的事件。UIApplication对象在程序启动时启动main run Loop,它处理事件和更新视图的界面, 是运行在程序的主线程上的。

发散点:NSRunLoop的学习与使用.

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode

beforeDate:[NSDate dateWithTimeIntervalSinceNow:5]];

三 App States (应用程序状态)

1 Not running 未运行:程序没启动或者被系统终止;

2 Inactive 未激活:程序在前台运行,不过没有接收到事件。应用处于这个状态时,很多时候仅仅是当时正要转向另一个状态;

3 Active 激活:程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。

4 Background 后台:程序在后台而且能执行代码。应用程序进入这个状态多半是因为要进入Suspended状态;应用程序在从Background转向Suspended状态之前可以请求额外的时间来完成一些后台的处理。In addition, an app being launched directly into the background enters this state instead of the inactive state.

5 Suspended 挂起:程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

四 程序切换时AppDelegate收到的回调

  • application:willFinishLaunchingWithOptions: 应用程序启动时调用.一般不需要做特殊处理.

  • application:didFinishLaunchingWithOptions: 应用启动时调用,此时应用还没有展示给用户,停留在所谓的开机画面页,在这个方法中做一些必要的初始化操作,以前没有设置main story board进入的时候,是需要通过代码来alloc window并设置root view controller的. 注意在该方法中不要执行耗时操作,比如大量的IO操作等等,因为如果较长时间这个方法还没有执行完毕(测试的时候大概是30s左右),iOS会杀掉进程的.

  • applicationDidBecomeActive:应用程序进入到Active状态,意味着应用将要切换到前台.

  • applicationWillResignActive:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话

  • applicationDidEnterBackground:应用程序已经进入后台状态.

  • applicationWillEnterForeground: 应用程序将要进入前台的时候调用,在这个时候还没有变成Active状态.

  • applicationWillTerminate:应用程序将要被系统终止,注意,如果应用已经是Suspended状态下这个方法不会被调用,所以如果想在程序被杀掉之前保存一些数据的话,需要注意尽量避免在这个方法中去做数据保存的事情

此外,还有方法

- (void)applicationDidFinishLaunching:(UIApplication *)application;

但是SDK文档明确说明,应该用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions替代.

五 在实际开发过程中,我们发现,在iOS 7和iOS 8 上,root view controller的viewDidLoad和

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions中的方法执行的先后顺序是不同的,也没有看到明确的文档说明,可能也和设定root view controller的方式有关。

当时遇到的问题是,在root view controller的viewDidload方法中通过addObserver来观察一个后台任务是否执行完成;而这个后台任务在didFinishLaunchingWithOptions中启动。在iOS 7 上, viewDidload会在构造root view controller之后被先执行,这样addObserver会在后台任务发送消息之前先执行,整个流程没问题;但是iOS 8上,后台任务可能都已经执行完了,postNotification已经调用过了,root view controller的viewDidLoad还没有开始调用,导致addObserver没被调用而导致bug。

所以,建议两者之间不要有强关联,不要互相依赖对方的执行。

六 在applicationDidEnterBackground时,如果还希望长时间的运行任务,可以调用下面的方法:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

NSLog(@"startBackgroundTask time out");

    // do something .....

}];

除此以外,在执行这些回调函数的时候,应该尽快的执行完毕并返回。

iOS-App生命周期的更多相关文章

  1. ios app 生命周期

    https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/The ...

  2. 图解ios程序生命周期

    图解ios程序生命周期 应用程序启动后状态有Active.Inactive.Background.Suspended.Not running这5种状态,几种状态的转换见下图: 在AppDelegate ...

  3. (转)深入浅出 iOS 之生命周期

    原文:http://www.cocoachina.com/applenews/devnews/2011/0817/3129.html 深入浅出 iOS 之生命周期 发布于:2011-08-17 10: ...

  4. 【转】深入浅出 iOS 之生命周期

    [iOS]深入浅出 iOS 之生命周期 深入浅出 iOS 之生命周期  http://blog.csdn.net/kesalin/article/details/6691766 罗朝辉(http:// ...

  5. 微信小程序APP生命周期

    小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...

  6. 微信APP生命周期、页面生命周期

    目录 小程序的启动流程 app生命周期 页面的生命周期 页面的生命周期(图) 小程序的启动流程 我们画一个图来表示一下,整个小程序的启动流程,我们就知道了: app生命周期 执行App()函数也就是注 ...

  7. 微信小程序-APP生命周期与运行机制

    QQ讨论群:785071190 开发微信小程序之前需要先了解微信小程序运行机制以及其生命周期,小程序APP生命周期需要先从app.js这个文件开始. 阅读过"微信小程序-代码构成" ...

  8. iOS的生命周期

    iOS应用程序一般都是由自己编写的代码和系统框架组成.系统框架提供了一些基本的infrastructure给APP来运行,而开发者则自己编写代码定制APP的外观和行为,了解iOS infrastruc ...

  9. 深入浅出 iOS 之生命周期

    转:http://blog.csdn.net/kesalin/article/details/6691766 iOS应用程序的生命周期相比 Android 应用程序的生命周期来说,没那么简明易懂,但是 ...

  10. 14 - XML、JSON、PLIST对比和APP生命周期

    XML中间的 数据表达/传输数据的语言 优点:特别强大 强大到很多平台都有基于XML的独立语言,如MXML.HTML 缺点:传输小型数据时,特别啰嗦 size / speed = time JSON ...

随机推荐

  1. Dojo学习_组件属性

    注意组件的引用顺序,避免出现对象不是构造函数或属性undefined的情况! 1.修改文本  require([ 'dojo/dom', 'dojo/domReady!' ], function (d ...

  2. 第一个Spring demo

    参考Spring3.x企业实战 1.新建web工程chapter5,导入jar包.注意:cglib和commons-dbcp这两个包 2.设计数据库 t_login_log表结构(存放日志信息),主键 ...

  3. hihoCoder 1305 区间求差

    #1305 : 区间求差 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1, A2 ], [ A3,  ...

  4. Codeforces 723C. Polycarp at the Radio 模拟

    C. Polycarp at the Radio time limit per test: 2 seconds memory limit per test: 256 megabytes input: ...

  5. Mac上的抓包工具Charles

    http://blog.csdn.net/jiangwei0910410003/article/details/41620363 $********************************** ...

  6. anelife

    无论如何要把安e生活做到最棒! 1.先用脑再用力!

  7. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]

    作业提交时间:10月9日上课前. Design and implement an Elevator Scheduler to aim for both correctness and performa ...

  8. (Python)序列

    本节将学习一些循环序列的方法已经序列的大小比较规则 1.循环序列的方法 如果我们想同时循环打印一个列表的index和value,我们可以用enumerate(list) 函数 >>> ...

  9. UITableViewCell重用的问题

    UITableView中有两种重用Cell的方法: - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (id)dequ ...

  10. Windows2008当桌面使用

    因为需要32位系统,又想用8G内存. 一.提高开机速度   0 |" t7 A- d! `- A- R5 | 1.免除登录时按Ctrl+Alt+Del的限制 打开<开始> - & ...