關(guān)于這方面的文章,網(wǎng)上有很多了,但還是想從點滴積累良风,寫下自己的理解,才能真正轉(zhuǎn)化為屬于自己的東西
從一個project來看應(yīng)用啟動過程闷供,簡單點可以以main函數(shù)為分水嶺烟央,分為main函數(shù)之前和main函數(shù)之后兩個過程。之前看過唐巧的博客有很深入介紹main函數(shù)之前的啟動過程分析歪脏。但我想先從簡單的main函數(shù)之后的執(zhí)行分析疑俭,關(guān)于main函數(shù)之前,app啟動做了那些操作婿失,計劃下次掌握的更透徹了在來寫文章記錄下自己的分析和理解钞艇。
下面是大家都很熟悉的main.m文件啄寡,簡單的幾行代碼,卻包含了main函數(shù)開始哩照,app啟動執(zhí)行的好幾項操作呢~
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
很顯然挺物,main()函數(shù)只做了一件事,那就是調(diào)用UIApplicationMain()函數(shù)葡秒,接下來還是先了解下UIApplicationMain()函數(shù)吧~
/**
* UIApplicationMain()函數(shù)剖析:
*
* 一姻乓、UIApplicationMain()函數(shù)負責(zé):
* 1嵌溢、創(chuàng)建應(yīng)用程序?qū)ο骍IApplication
* 2眯牧、創(chuàng)建應(yīng)用程序代理AppDelegate
* 3、開啟事件循環(huán)Main RunLoop赖草,delegate對象監(jiān)聽系統(tǒng)事件通知application對象
*
* 二学少、關(guān)于UIApplication?Main()的參數(shù)
* 1、前兩個參數(shù)是命令行參數(shù)秧骑。
* 2版确、principalClassName: 該參數(shù)為 UIApplication 類名或其子類名的字符串,nil 是默認(rèn)為 UIApplication乎折。
* 3绒疗、delegateClassName: 該參數(shù)為要初始化的應(yīng)用程序代理(AppDelegate)類,也可指定為 nil骂澄,但需要從應(yīng)用程序的主 nib 文件加載代理對象吓蘑。
*
* 三、UIApplication?Main()函數(shù)返回值
* 雖然該函數(shù)有返回值坟冲,但從不返回
*
**/
int UIApplicationMain(int argc, char * _Nonnull argv[], NSString *principalClassName, NSString *delegateClassName);
至此UIApplicationMain方法執(zhí)行完成磨镶,程序啟動完畢,開始調(diào)用Application的delegate方法處理監(jiān)聽到的事件健提。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
- (void)applicationWillTerminate:(UIApplication *)application {
}
在application:didFinishLaunchingWithOptions:方法內(nèi)琳猫,會創(chuàng)建并設(shè)置應(yīng)用的UIWindow和UIWindow的rootVC,并顯示窗口私痹。
接下來脐嫂,就會根據(jù)讀取的info.plist文件,看是否需要加載Main.storyboard文件設(shè)置UIWindow紊遵。
綜上账千,main函數(shù)之后app啟動的完整過程為:
1、執(zhí)行main函數(shù)
2癞蚕、執(zhí)行UIApplicationMain函數(shù) (執(zhí)行和完成流程詳見UIApplicationMain()函數(shù)剖析)
3蕊爵、UIApplicationDelegate對象開始處理監(jiān)聽到的事件