iOS-应用生命周期
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
main函數的兩個參數,iOS中沒有用到,包括這兩個參數是為了與標準ANSI C保持一致。 UIApplicationMain函數,前兩個和main函數一樣,重點是后兩個。后兩個參數分別表示程序的主要類(principal class)和代理類(delegate class)。如果主要類(principal class)為nil,將從Info.plist中獲取,如果Info.plist中不存在對應的key,則默認為UIApplication;如果代理類(delegate class)將在新建工程時創建。
1、每個應用程序都有屬于自己的UIWindow(分為:1、狀態欄,2、下面控制器控制的UIView),UIWindow繼承自UIView
2、每個控制器都有默認的UIView.
3、一個控制器管理一個UIView.
?
在PC中,應用程序多是使用視窗的形式顯示內容,手機應用也不例外,手機應用中要在屏幕上顯示內容首先要創建一個窗口承載內容,iOS應用中使用UIWindow、UIView來實現內容顯示。
UIWindow:
UIWindow對象是所有UIView的根視圖,管理和協調的應用程序的顯示、分發事件給View。UIWindow類是UIView的子類,可以看作是特殊的UIView。一般應用程序只有一個UIWindow對象,即使有多個UIWindow對象,也只有一個UIWindow可以接受到用戶的觸屏事件。UIWindow初始化在AppDeleDgate里面的didFinishLaunchingWithOptions方法。
UIView:
UIView類繼承自UIResponder,負責在屏幕上定義一個矩形區域,視圖用于展示界面及響應用戶界面交互。每個視圖對象都要負責渲染視圖區域的內容,并響應該區域中發生的操作事件。除了顯示內容和處理事件之外,視圖可以嵌套并管理子視圖。子視圖是指嵌入到另一視圖對象內部的視圖對象,而被嵌入的視圖對象是父視圖。視圖添加到window中就會顯示出來。
?
根據UIApplicationMain函數,程序將進入AppDelegate.m,這個文件是xcode新建工程時自動生成的。
1、告訴代理進程啟動但還沒進入狀態保存
- (BOOL)application:(UIApplication*)application willFinishLaunchingWithOptions:(NSDictionary*)launchOptions
2、在應用程序加載完畢之后調用
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
3、程序失去焦點的時候調用(不能跟用戶進行交互了)當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,比如來電話了
- (void)applicationWillResignActive:(UIApplication*)application
4、當應用程序獲取焦點的時候調用-獲取焦點之后才可以跟用戶進行交互當應用程序入活動狀態執行,這個剛好跟上面那個方法相反
- (void)applicationDidBecomeActive:(UIApplication*)application
5、當程序被推送到后臺的時候調用。所以要設置后臺繼續運行,則在這個函數里面設置即可 (點擊HOME鍵)
- (void)applicationDidEnterBackground:(UIApplication *)application
6、當程序從后臺將要重新回到前臺時候調用,這個剛好跟上面的那個方法相反。
- (void)applicationWillEnterForeground:(UIApplication *)application
7、當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作。這個需要要設置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationWillTerminate:(UIApplication *)application
?
初次啟動:
iOS_didFinishLaunchingWithOptions
iOS_applicationDidBecomeActive
按下home鍵:
iOS_applicationWillResignActive
iOS_applicationDidEnterBackground
點擊程序圖標進入:
iOS_applicationWillEnterForeground
iOS_applicationDidBecomeActive
?
當應用程序進入后臺時,應該保存用戶數據或狀態信息,所有沒寫到磁盤的文件或信息,在進入后臺時,最后都寫到磁盤去,因為程序可能在后臺被殺死。釋放盡可能釋放的內存。
- (void)applicationDidEnterBackground:(UIApplication *)application
方法有大概5秒的時間讓你完成這些任務。如果超過時間還有未完成的任務,你的程序就會被終止而且從內存中清除。
如果還需要長時間的運行任務,可以在該方法中調用:
[application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"begin Background Task With Expiration Handler");
}];
程序終止
程序只要符合以下情況之一,只要進入后臺或掛起狀態就會終止:
①iOS 4.0以前的系統
②app是基于iOS 4.0之前系統開發的。
③設備不支持多任務
④在Info.plist文件中,程序包含了 UIApplicationExitsOnSuspend 鍵。
系統常常是為其他app啟動時由于內存不足而回收內存最后需要終止應用程序,但有時也會是由于app很長時間才響應而終止。如果app當時運行在后臺并且沒有暫停,系統會在應用程序終止之前調用app的代理的方法 - (void)applicationWillTerminate:(UIApplication *)application,這樣可以讓你可以做一些清理工作。你可以保存一些數據或app的狀態。這個方法也有5秒鐘的限制。超時后方法會返回程序從內存中清除。
轉載于:https://www.cnblogs.com/onefboy/p/5718035.html
總結
以上是生活随笔為你收集整理的iOS-应用生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译php源码错误集与解决
- 下一篇: LNMP_静态文件不记录日志,配置缓存