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