標籤:
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!");
}
iOS -- 後台相關