iOS 应用程序的生命周期

所谓生命周期,就是指从 App 启动到关闭这一过程所发生的一系列事件。

App 的状态

Not running:未运行:程序没有启动。

Inactive:未激活:程序已启动,在前台运行,但未接收到事件。

Active:已激活:程序在前台运行,并且接收到了事件。

Background:后台:程序在后台运行,而且能执行代码,大多数程序在进入到这个状态之后,会在该状态停留一会,然后会进入到挂起状态。有的程序经过特殊的请求后可以长期处于 Background 状态。

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

各个状态时代理的方法调用

1.告诉代理进程启动但还没进入状态保存

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"①告诉代理进程启动但还没进入状态保存"); 
    return YES; 
} 

2.告诉代理启动基本完成程序准备开始运行

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

     NSLog(@"②告诉代理启动基本完成程序准备开始运行"); 

     // Override point for customization after application launch. 

     self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
}

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

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    NSLog(@"③当应用程序将要入非活动状态执行"); 
}

4.当应用程序进入活动状态执行

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSLog(@"④当应用程序进入活动状态执行"); 
}

5.当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    NSLog(@"⑤当程序被推送到后台的时候调用"); 

    [application beginBackgroundTaskWithExpirationHandler:^{ 

        NSLog(@"begin Background Task With Expiration Handler"); 

    }]; 
} 

6.当程序从后台将要重新回到前台时候调用

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
     NSLog(@"⑥当程序从后台将要重新回到前台时候调用"); 
} 

7.当程序将要退出时被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置 UIApplicationExitsOnSuspend 的键值

- (void)applicationWillTerminate:(UIApplication *)application 
{
    NSLog(@"⑦当程序将要退出是被调用"); 
}

8.当程序载入后执行

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    NSLog(@"⑧当程序载入后执行"); 
}

进入后台

当应用程序进入到后台时,该做什么呢?

保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死。

尽可能的释放的内存。

- (void)applicationDidEnterBackground:(UIApplication *)application

此方法有大概5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。

在后台时,每个应用程序都应该释放最大的内存。系统努力的保持更多的应用程序在后台同时 运行。不过当内存不足时,会终止一些挂起的程序来回收内存,那些内存最大的程序首先被终止。

事实上,应用程序应该的对象如果不再使用了,那就应该尽快的去掉强引用,这样编译器可以回收这些内存。如果你想缓存一些对象提升程序的性能,你可以在进入后台时,把这些对象去掉强引用。

下面这样的对象应该尽快的去掉强引用:

1)图片对象

2)你可以重新加载的 大的视频或数据文件

3)任何没用而且可以轻易创建的对象

在后台时,为了减少程序占用的内存,系统会自动在回收一些系统帮助你开辟的内存。比如:

1)系统回收Core Animation的后备存储。

2)去掉任何系统引用的缓存图片

3)去掉系统管理数据缓存强引用

返回前台

在暂停状态的应用程序必须准备处理任何排队的通知时,它返回到前台或后台执行状态。暂停的应用程序不执行任何代码,因此不能处理与方向的变化,时间的变化,偏好的变化,以及许多其他会影响应用程序的外观或状态的通知。为了确保这些更改不会丢失,系统排队许多相关的通知,并把它们传递给应用程序,只要它开始再次执行代码(无论是在前景或背景)。为了防止由偏快转为超载与它恢复时通知您的应用程序,该系统凝聚事件,并提供一个单一的通知(每个相关类型),反映了净变化,因为你的应用程序被暂停。