iOS APP啟動流程
做ios也有一段時間了匣摘,但是app的整個的啟動流程還似懂非懂全肮,看了許多的博客和資料熊响,在這里寫篇博客權(quán)當(dāng)總結(jié)筆記
在開始之前我們先看兩張啟動流程圖
圖一
<center>xcode4.2的啟動示意圖,不使用storyboarding</center>
圖二
<br /><br />
從上面兩張圖我們可以看出患朱,也是從main()函數(shù)開始轨功,iOS的面函數(shù)比較簡單就幾行代碼旭斥,只是調(diào)用
UIApplicationMain
函數(shù) ,這個函數(shù)如下
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
我們先來看一下UIApplicationMain
的這幾個參數(shù):
- argc 表示參數(shù)個數(shù)
- argv 表示函數(shù)參數(shù)的數(shù)組
- 是UIApplication類名或者是其子類名,如果是nil古涧,則就默認(rèn)使用UIApplication類名
- 是協(xié)議UIApplicationDelegate的實例化對象名垂券,如果是nil,則從main nib文件中加載委托對象蒿褂。這個對象就是UIApplication對象監(jiān)聽到系統(tǒng)變化的時候通知其執(zhí)行的相應(yīng)方法
此函數(shù)會創(chuàng)建一個UIApplication對象圆米,并根據(jù)第四個參數(shù)創(chuàng)建一個delegate對象,然后將此delegate對象賦值給UIApplication對象的delegate屬性啄栓。
接著會建立應(yīng)用程序的Main Runloop
循環(huán)娄帖,調(diào)用UIApplicationDelegate中的函數(shù)進(jìn)行事件處理
UIApplication
UiApplication代表一個應(yīng)用程序,每一個應(yīng)用程序都有一個UIApplication全局對象昙楚,而且這個對象是單例的近速,我們在程序中可以通過[UIApplication sharedApplication]
獲得這個對象,進(jìn)行一些應(yīng)用級的操作堪旧。UIApplication是應(yīng)用程序的開始削葱,它維護了一個在本應(yīng)用程序中打開的Window列表,負(fù)責(zé)初始化顯示UIWindow淳梦,并負(fù)責(zé)加載應(yīng)用程序的第一個UIView到UIWindow窗口中析砸,在隨后的操作中,我們也可以更換UIWindow窗口的顯示內(nèi)容爆袍。此外首繁,UIApplication還被賦予一個代理對象作郭,在實際編程中,我們一般并不直接與UIApplication打交道弦疮,而是和其代理對象UIApplicationDelegate
打交道夹攒,UIApplication負(fù)責(zé)監(jiān)聽接收事件,而由UIApplicationDelegate決定應(yīng)用程序如何去響應(yīng)這些事件(生命周期:程序啟動和關(guān)閉胁塞,系統(tǒng)事件:來電咏尝、記事項警告)等等。
UIApplicationDelegate
所有的移動操作系統(tǒng)都有個致命的缺點:app很容易受到打擾.比如一個來電或者鎖屏?xí)?dǎo)致app進(jìn)入后臺甚至被終止;還有很多其他類似的情況會導(dǎo)致app受到干擾,在app受到干擾時,會產(chǎn)生一些系統(tǒng)事件,這時UIApplication會通知它的delegate對象,讓delegate來處理這些系統(tǒng)事件.由圖二我們可以看到代理類可以處理許多事件
1.程序加載完畢
2.程序獲取焦點
3.程序進(jìn)入后臺
4.程序失去焦點
5.程序從后臺回到前臺
6.內(nèi)存不足警告
7.程序即將退出
</br>
程序中的AppDelegate.m都有相關(guān)的對應(yīng)函數(shù)
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
// 當(dāng)應(yīng)用程序啟動完畢的時候就會調(diào)用(系統(tǒng)自動調(diào)用)
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//Override point for customization after application launch.
return YES;
}
// 即將失去活動狀態(tài)的時候調(diào)用(失去焦點, 不可交互)
-(void)applicationWillResignActive:(UIApplication *)application {
}
//應(yīng)用程序進(jìn)入后臺的時候調(diào)用
// 一般在該方法中保存應(yīng)用程序的數(shù)據(jù), 以及狀態(tài)
-(void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
// 應(yīng)用程序即將進(jìn)入前臺的時候調(diào)用
// 一般在該方法中恢復(fù)應(yīng)用程序的數(shù)據(jù),以及狀態(tài)
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
//重新獲取焦點(能夠和用戶交互)
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
// 應(yīng)用程序即將被銷毀的時候會調(diào)用該方法
// 注意:如果應(yīng)用程序處于掛起狀態(tài)的時候無法調(diào)用該方法
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:
}
<strong>講到這里我們可以看出一個APP的完整的啟動流程</strong>:
1.main函數(shù)
2.執(zhí)行UIApplicationMain函數(shù)
1.創(chuàng)建UIApplication對象
2.創(chuàng)建UIApplicationDelegate對象并復(fù)制
3.讀取配置文件info.plist啸罢,設(shè)置程序啟動的一些屬性编检,(關(guān)于info.plist的內(nèi)容我們下篇在講解)
4.創(chuàng)建應(yīng)用程序的Main Runloop
循環(huán)
3.UIApplicationDelegate對象開始處理監(jiān)聽到的事件
1.程序啟動成功之后,首先調(diào)用<code>application:didFinishLaunchingWithOptions:</code>方法,
如果info.plist文件中配置了啟動storyboard文件名伺糠,則加載storyboard文件蒙谓。
如果沒有配置,則根據(jù)代碼來創(chuàng)建UIWindow--->UIWindow的rootViewController-->顯示
</br>
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//所要顯示的視圖控件
LJTViewControler *LJTVC = [[LJTViewController alloc] init];
self.window.rootViewController=LJTVC;
[self.window makeKeyAndVisible];
return YES;
}