简单聊一聊iOS的那些生命周期

来源:互联网 发布:dateadd sql 编辑:程序博客网 时间:2024/05/20 18:18

iOS的那些生命周期



iOS应用程序的生命周期,程序是在前台运行还是后台运行以及各个状态之间的变化,这些对于iOS开发者都是特别重要的,应用程序在前台和后台的状态是不一样的,在后台运行时,程序会受到很多系统的限制。本文将会说到iOS程序的生命周期以及视图的生命周期




应用生命周期


iOS应用程序一共有5种状态


Not Running   (非运行状态)   应用没有被运行或者被iOS系统终止

Inactive (前台非活动状态)   应用正在进入前台状态 但是还是不能接受事件

Active (前台活跃状态)  应用进入前台状态 可以接受事件

Background (后台状态) 应用进入后台之后 依然可以执行代码 如果有可以执行的代码 就会执行代码 没有执行的代码 应用就会马上进入挂起状态 但是有的应用经过特殊的请求之后可以长期处于Background 状态  比如音乐播放器

Suspended (挂起状态) 处于挂起状态的应用进入一种“冷冻”状态 不能执行代码 如果苹果系统内存不够 系统就会把挂起的应用清理掉 为前台提供更多的内存 应用会被终止


应用程序不同状态以及它们彼此之间的关系 如下图所示



AppDelegage类是应用程序的委托对象  在应用生命周期的不同阶段系统会回调不同的方法

#import "AppDelegate.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {        NSLog(@"%@",@"application:didFinishLaunchingWithOptions:");    return YES;}- (void)applicationWillResignActive:(UIApplication *)application {    NSLog(@"%@",@"applicationWillResignActive:");}- (void)applicationDidEnterBackground:(UIApplication *)application {    NSLog(@"%@",@"applicationDidEnterBackground:");}- (void)applicationWillEnterForeground:(UIApplication *)application {    NSLog(@"%@",@"applicationWillEnterForeground:");}- (void)applicationDidBecomeActive:(UIApplication *)application {    NSLog(@"%@",@"applicationDidBecomeActive:");}- (void)applicationWillTerminate:(UIApplication *)application {    NSLog(@"%@",@"applicationWillTerminate:");}@end


为了让大家更加直观的了解各个状态与其相应的方法  下面以几个应用场景为切入点进行系统的分析


(-)非运行状态——应用启动场景

场景描述: 用户点击应用图标 进入应用    共经历两个阶段三个状态   Not Running-Inactive-Active

1.Not Running-Inactive 阶段    调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {        NSLog(@"%@",@"application:didFinishLaunchingWithOptions:");    return YES;}

2.Inactive-Active 阶段  调用
- (void)applicationDidBecomeActive:(UIApplication *)application {    NSLog(@"%@",@"applicationDidBecomeActive:");}

(二)点击Home键——应用退出场景

 场景描述: 应用处于运行状态(Active状态)时  点击Home键或者有其他应用导致当前应用中断  该场景的状态跃迁状态可以分为两种情况  第一种情况是:应用可以在后台运行或者挂起  第二种情况是不可以在后台运行或者挂起  根据产品属性文件(如HelloWorld-Info.plist)中的相关属性Application does not run in background是与否控制这两种状态

状态跃迁的第一种情况:应用可以在后台运行或者挂起  共经历3个阶段4种状态 Active-Inactive-Backgrond-Suspended

1.在Active-Inactive 阶段 调用
- (void)applicationWillResignActive:(UIApplication *)application {    NSLog(@"%@",@"applicationWillResignActive:");}

2.Inactive-Background 阶段 调用

这个阶段不涉及我们重点说明的方法

3.Backgrond-Suspended 阶段 调用
- (void)applicationDidEnterBackground:(UIApplication *)application {    NSLog(@"%@",@"applicationDidEnterBackground:");}

状态跃迁的第二种情况: 应用不可以在后台运行或者挂起  共经历4个阶段5种状态 Active-Inactive-Backgrond-Suspended-Not Running

前三个阶段调用都是一样的  Suspended-Not Running 阶段会调用
- (void)applicationWillTerminate:(UIApplication *)application {    NSLog(@"%@",@"applicationWillTerminate:");}


(三)挂起重新运行场景

  场景描述:挂起状态的应用重新运行 该场景的状态跃迁过程共经历3个阶段4个状态 Suspended-Background-Inactive-Active

1.在Suspended-Background阶段 应用从挂起状态到进入后台 

不涉及我们讲的这几个方法

2.在Background-Inactive阶段  调用
- (void)applicationWillEnterForeground:(UIApplication *)application {    NSLog(@"%@",@"applicationWillEnterForeground:");}

3.在Inactive-Active阶段 调用
- (void)applicationDidBecomeActive:(UIApplication *)application {    NSLog(@"%@",@"applicationDidBecomeActive:");}


(四)内存清除 应用终止

 场景描述:应用在后台处理完事件时进入挂起状态(这是一种休眠状态)如果这时发出内存警告 为了满足其他应用对内存的需求 该应用就会被清除内存从而终止运行 该场景的跃迁状态共经历2个阶段3种状态  Backgrond-Suspended-Not Running

  内存清除的时候应用终止运行 内存清除也有两种情况 可能是系统强制清除内存 也有可能是使用者从任务栏中手动清除 内存清除后如果应用再次运行 上一次的状态不会调用任何方法 




视图生命周期


当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc                                   创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView                          从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad                   载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear              视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear               视图已在屏幕上渲染完成

当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear            视图将被从屏幕上移除之前执行
2、viewDidDisappear             视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc                                 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

关于viewDidUnload :在发生内存警告的时候如果本视图不是当前屏幕上正在显示的视图的话, viewDidUnload将会被执行,本视图的所有子视图将被销毁,以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建的对象释放内存。 因为当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图。

当我们创建一个UIViewController类的对象时,通常系统会生成几个默认的方法,这些方法大多与视图的调用有关,但是在视图调用时,这些方法的调用顺序如何,需要整理下。

通常上述方法包括如下几种,这些方法都是UIViewController类的方法: 

- (void)viewDidLoad; 

- (void)viewDidUnload; 

- (void)viewWillAppear:(BOOL)animated; 

- (void)viewDidAppear:(BOOL)animated; 

- (void)viewWillDisappear:(BOOL)animated; 

- (void)viewDidDisappear:(BOOL)animated; 

 

下面介绍下APP在运行时的调用顺序。

1)- (void)viewDidLoad;

      一个APP在载入时会先通过调用loadView方法或者载入IB中创建的初始界面的方法,将视图载入到内存中。然后会调用viewDidLoad方法来进行进一步的设置。通常,我们对于各种初始数据的载入,初始设定等很多内容,都会在这个方法中实现,所以这个方法是一个很常用,很重要的方法。

      但是要注意,这个方法只会在APP刚开始加载的时候调用一次,以后都不会再调用它了,所以只能用来做初始设置。

2) - (void)viewDidUnload; (iOS 6以后换为didReceiveMemoryWarning

      在内存足够的情况下,软件的视图通常会一直保存在内存中,但是如果内存不够,一些没有正在显示的viewcontroller就会收到内存不够的警告,然后就会释放自己拥有的视图,以达到释放内存的目的。但是系统只会释放内存,并不会释放对象的所有权,所以通常我们需要在这里将不需要在内存中保留的对象释放所有权,也就是将其指针置为nil。

      这个方法通常并不会在视图变换的时候被调用,而只会在系统退出或者收到内存警告的时候才会被调用。但是由于我们需要保证在收到内存警告的时候能够对其作出反应,所以这个方法通常我们都需要去实现。

      另外,即使在设备上按了Home键之后,系统也不一定会调用这个方法,因为IOS4之后,系统允许将APP在后台挂起,并将其继续滞留在内存中,因此,viewcontroller并不会调用这个方法来清除内存。

3)- (void)viewWillAppear:(BOOL)animated;

      系统在载入所有数据后,将会在屏幕上显示视图,这时会先调用这个方法。通常我们会利用这个方法,对即将显示的视图做进一步的设置。例如,我们可以利用这个方法来设置设备不同方向时该如何显示。

      另外一方面,当APP有多个视图时,在视图间切换时,并不会再次载入viewDidLoad方法,所以如果在调入视图时,需要对数据做更新,就只能在这个方法内实现了。所以这个方法也非常常用。

4) - (void)viewDidAppear:(BOOL)animated;

      有时候,由于一些特殊的原因,我们不能在viewWillApper方法里,对视图进行更新。那么可以重写这个方法,在这里对正在显示的视图进行进一步的设置。

5) - (void)viewWillDisappear:(BOOL)animated; 

      在视图变换时,当前视图在即将被移除、或者被覆盖时,会调用这个方法进行一些善后的处理和设置。

      由于在IOS4之后,系统允许将APP在后台挂起 所以在按了Home键之后,系统并不会调用这个方法,因为就这个APP本身而言,APP显示的view,仍是挂起时候的view,所以并不会调用这个方法

6) - (void)viewDidDisappear:(BOOL)animated

      我们可以重写这个方法,对已经消失,或者被覆盖,或者已经隐藏了的视图做一些其他操作


 
2 0
原创粉丝点击