1.點選一個app
首先,我們在手機上點選一個app圖示
2.核心初始化
- 作業系統收到啟動app的訊息後,會呼叫核心程式碼初始化記憶體空間,為app建立程序
- 然後作業系統透過系統呼叫讀取並解析app的可執行檔案
- 然後作業系統的動態連結器根據app的可執行檔案的符號表去載入app執行依賴的動態庫,或者叫共享庫,並與符號表進行繫結,如果動態庫已經載入過的話就直接繫結就行了,因為很多動態庫是app共享的,可能在記憶體常駐。
- 經過動態繫結以後,app的所有可執行程式碼和資料都已經準備就緒了,這個時候作業系統為app分配堆疊空間,複製程式碼和資料到記憶體等一系列操作
- 然後確定程式啟動的記憶體位置,開始執行具體的二進位制指令
3.從開始到main函式
程式碼指令並不是從main函式開始執行的,在main函式之前還有一系類的關於程式碼的初始化操作,比如: - runtime執行時初始化。
全域性變數的初始化。
4 執行UIApplicationMain - 第二步在UIApplicationMain內部執行,根據principalClassName建立UIApplication物件
- 第三步根據delegateClassName建立一個delegate物件,並將該delegate物件賦值給UIApplication物件中的delegate屬性。所以,我們的AppDelegate遵循UIApplicationDelegate協議
5.* 開啟一個主執行迴圈,處理事件,可以讓程式保持執行 - 接下來,要載入info.plist,info.plist相當於我們應用程式的配置檔案
6.為了實現多視窗功能,蘋果修改了使用多年的AppDelegate,把AppDelegate分為了兩部分,AppDelegate和SceneDelegate,其中 - AppDelegate處理應用程式狀態的改變,比如應用程式的載入,退出
- AppDelegate中新增對scene的支援
7.使用Scene Delegate之後,UIApplicationDelegate將不再持有UIWindow,它將轉移至UIWindowSceneDelegate代理中
最後我們從載入配置檔案開始重新梳理一下對於大於IOS13的啟動過程 - 首先呼叫AppDelegate中的configurationForConnectingSceneSession協議,該協議會返回預設載入場景的UISceneConfiguration*
- 在Info.plist->Application Scene Manifest->Scene Configuration->Application Session Role中尋找場景列表,如果有,根據上一步返回的值匹配應該載入哪個場景,如果上一步返回nil,匹配列表中的第一個。如果列表為空,不載入場景,這時候應該是黑屏
- 如果匹配到了場景資訊
- 如果包含storyboard,載入介面storyboard到UIWindow,執行下一步
- 否則,繼續執行下一步
- 開始執行場景委託的willConnectToSession協議方法
- 該協議中可以初始化並顯示UIwinodw,如果不進行處理,UIWindow就用之前載入過的storyboard
- 顯示介面,完成。