iOS app啟動流程
最近看了些Runtime Runloop的一些知識.邊看邊摸索.看到群裡有人在問 一些面試題.其中就提到了app的啟動流程.
所以這裡也研究小結一下,以供自己學習備用.
1.專案要執行,就要有入口. OC語言的入口就在main.m 檔案.下面看main.m裡都有什麼可以窺探的.
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
在自動釋放池裡我們可以看到裡面就一行程式碼
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
這行程式碼我們手打一下.可以看到傳的引數
UIApplicationMain(<#int argc#>, <#char * _Nonnull * _Null_unspecified argv#>, <#NSString * _Nullable principalClassName#>, <#NSString * _Nullable delegateClassName#>)
下面我們一步步解析這句關鍵的程式碼如何啟動App
UIApplicationMain 就是OC的入門點. 裡面傳遞了四個引數:
argc 是一個int引數
argv 是一個char 引數
principalClassName 主程式類名( 當值為 nil 時,預設是UIApplication)
delegateClassName 代理類名 預設就是常見的AppDelegate類
在上面的傳參時候用到了NSStringFromClass 方法.
NSStringFromClass 是將類名轉化為字串的轉化函式.與此類似的還有字串轉化類名的NSClassFromString.
2.設定了物件和代理之後就是NSRunloop 來保持程式一直執行處理事件(詳情請看上一篇說的runloop文章)
3.接下來就是info.plist檔案.檢查是否通過main.storyboard載入指定的控制器. 把新建立的控制器作為視窗的跟控制器,讓視窗顯示出來.如果沒有則會在下面方法中建立UIWindow 來作為主視窗
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //建立UIWindow 來作為主視窗 return YES; }
4.最後通過執行程式AppDelegate的代理.程式完成啟動