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. BIEE 11g学习

    biee 11g学习1. 创建资料档案库文件(RPD)  文件数据库 1.1 创建数据源连接          运行Net Manager 用于BIEE的数据库服务 1.2 模型的建立   1.运行o ...

  2. Eclipse 反编译插件安装jad

    Eclipse的反编译插件一直在用jad,感觉很不错. 刚下了个新版的eclipse,配置jad的时候发现要多设置个东西. 从头开始 环境介绍: eclipse version:Kepler Rele ...

  3. three.js 源码注释(四十四)Light/DirectionalLight.js

    /** * * DirectionalLight方法 根据设置灯光的颜属性color, 强度属性intensity创建平行光光源. * DirectionalLight 对象的功能函数采用定义构造的函 ...

  4. Xshell快捷键

    Ctrl + L     清除工作区的内容

  5. oracle删除数据恢复

    分为两种方法:scn和时间戳两种方法恢复. 一.通过scn恢复删除且已提交的数据 1.获得当前数据库的scn号 select current_scn from v$database; (切换到sys用 ...

  6. [VS2013]如何闪开安装VS2013必须要有安装IE10的限制

    来源:http://blog.163.com/qimo601@126/blog/static/1582209320143354446462/   已阻止安装程序,此版本的Visual Studio需要 ...

  7. 【Java学习笔记】Map

    Map: 一次添加一对元素,也称为双列集合. 而Collection,一次添加一个元素,称为单列集合. 常用方法: 1.添加 value  put(key,value);        返回前一个与k ...

  8. js之事件

    1.事件类型 鼠标事件 onclick事件 鼠标点击某个对象 ondblclick事件 鼠标双击某个对象 onmousedown事件 鼠标按下 onmouseup事件 鼠标松开 onmouseover ...

  9. 关于 pgsql 数据库json几个函数用法的效率测试

    关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...

  10. ios图片的压缩

    最近做图片的上传,由于项目中的涉及到的图片是从相册和相机中拍照获取的,所以图片的类型不一定,有些是jpg有些是png,另外随着现在设备相继的像素越来越高,所拍摄的图片也越来越到,在图片上传之前我们是需 ...