最近看了些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的代理.程序完成啟動