iOS App啟動過程

王彬iOS發表於2024-06-25

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
  • 顯示介面,完成。

相關文章