1.进入后台时释放内存
如果应用没有启用ARC机制,程序需要在应用进入后台时,将那些需要释放的资源的引用计数变为0,从而让系统回收这些资源。
当应用转入前台时,系统需要重新恢复这些资源。
如果应用启用了ARC机制,程序只要在应用进入后台时,将应用那些需要释放的资源的变量赋为nil即可。当应用转入前台时,
系统需要重新恢复这些资源。
2.请求更多的后台时间
当应用转入后台后,不要在主线程中执行超过5秒的任务,如果应用进入后台花费了太多时间(即applicationDidEnterBackground:方法的执行体花费太多时间),应用可能从内存中被删除.
假如应用程序正在执行文件下载或文件传输等,当应用进入后台时,如果该任务还没有执行完成,应用转入后台该任务就会被暂停.千万不要强制在applicationDidEnterBackground:方法中直接完成该任务----因为这会导致应用进入后台花费太多时间,iOS系统可能直接从内存中删除该应用.正确的做法是: 以applicationDidEnterBackground:方法为平台,告诉系统进入后台还是更多的任务需要完成,从而向系统申请更多的后台时间.在这种方式下,当我们的应用处于后台时,即使用户正在使用其他应用,只要系统还是足够的内存,我们的应用就可以保存在内存中,iOS系统会保留应用运行一段时间。
// 应用转入前台时会向通知中心发送UIApplicationWillEnterForegroundNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector:@selector(enterBack:) name:UIApplicationWillEnterForegroundNotification
object:[UIApplication sharedApplication]];
// 应用转入前台时会向通知中心发送UIApplicationDidEnterBackgroundNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector:@selector(enterBack:) name:UIApplicationDidEnterBackgroundNotification
object:[UIApplication sharedApplication]];
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter]postNotificationName:@"stopCamera" object:nil];
backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{
// 如果超时这个block将被调用
YDLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
dispatch_async(dispatch_get_main_queue(), ^{
if (backgroundTask != UIBackgroundTaskInvalid){
YDLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
// do whatever needs to be done
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}else{
YDLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
}
});
}];
YDLog(@"%@",@"Reached the end of ApplicationDidEnterBackground - I‘m done!");
}