iOS生命周期

1,764 阅读4分钟

APP 生命周期

应用的5种状态:

  • 未运行(Not running) 程序没启动

  • 未激活(Inactive)

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

  • 激活(Active)

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

  • 后台(Backgroud)

    程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态

  • 挂起(Suspended)

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

状态图:

APP的生命周期就是UIApplicationDelegate中的回调方法,这些方法是根据状态变化进行响应:

1.application:willFinishLaunchingWithOptions: 在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复 2.application:didFinishLaunchingWithOptions: 表示App将从未运行状态进入运行状态,用于对App的初始化操作 3.applicationDidBecomeActive: 当应用即将进入前台运行时调用 4.applicationWillResignActive: 当应用即将进从前台退出时调用 5.applicationDidEnterBackground: 当应用开始在后台运行的时候调用 6.applicationWillEnterForeground: 当程序从后台将要重新回到前台(但是还没变成Active状态)时候调 7.applicationWillTerminate: 当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。 8.applicationDidFinishLaunching: 应用程序完成载入

各种情况下的应用状态

  • 加载进入前台的生命周期
  • 加载进入后台的生命周期
  • 响应中断的操作
  • 后台运行操作
  • 返回前台操作

一些操作看一下生命周期调用的顺序

1.程序启动:状态由Not running -> Inactive -> Active willFinishLaunchingWithOptions didFinishLaunchingWithOptions applicationDidBecomeActive

2.点击home键|锁屏:由Active -> Inactive -> Backgroud applicationWillResignActive applicationDidEnterBackground

3.重新进入前台:Backgroud -> Inactive -> Active applicationWillEnterForeground applicationDidBecomeActive

4.在前台,双击home键,手动杀掉APP:Active -> Inactive -> Backgroud -> end applicationWillResignActive applicationDidEnterBackground applicationWillTerminate

5.当URL到达时,如果你的应用没在正在运行,则会被启动并且移到前台运行以打开URL application:didFinishLaunchingWithOptions: application:openURL:sourceApplication: applicationDidBecomeActive

6.当URL到达时,如果你的应用正在background运行或被suspended,它将会被移到前台以打开URL applicationWillEnterForeground application:openURL:sourceApplication: applicationDidBecomeActive

详细的生命周期流程执行图

UIViewController 生命周期

Xib或者普通.h.m:
1-1 initWithNibName:bundle:------初始化(xib和纯代码),初始化控制器,可以写数据初始化操作,不要写View相关操作StoryBoard:
1-2 init StoryBoard
1-1 initWithCoder:------初始化,不会直接初始化控制器
1-2 awakeFromNib------xib加载完成(xib),一些实例化加载写在此处

2.loadView------加载视图,默认从nib,如果nib为空则会创建一个空视图(重写时,不要写super)
3.viewDidLoad------视图已经加载完成(自带的View加载完成),用于初始化数据、设定、约束、移除视图等操作
4.viewWillAppear:------视图将要出现,用于设置设备不同方向时如何显示,状态栏方向,视图显示样式
5.viewWillLayoutSubviews------view将要布局子视图
6.viewDidLayoutSubviews------view已经布局子视图
7.viewDidAppear:------视图已经显示
8.viewWillDisappear:------视图将要消失
9.viewDidDisappear:------视图已经消失
10.didReceiveMemoryWarning------控制器出现内存警告
11.dealloc------视图被销毁,系统只会释放内存,不会释放对象的所有权,所以通常在这里置为nil

UIView 生命周期

(纯代码)UIView创建为:[[UIView alloc] init];
1.initWithFrame:
2.init
3.layoutSubviews

(纯代码)UIView创建为:[[UiView alloc] initWithFrame:[UIScreen mainScreen].bounds];
1.initWithFrame:
2.layoutSubviews

(XIB)UIView创建为:NSArray *arr = [[NSBundle mainBundle] loadNibNamed:(@"XHView") owner:nil option:nil]; [arr lastObject];
1.initWithCoder:
2.awakeFromNib
3.layoutSubviews

参考资料:

www.jianshu.com/p/4026cb07c…

www.jianshu.com/p/1f6820a7d…

www.jianshu.com/p/9f2c7e80b…