只是介紹重點過程
- 預編譯器
- 符號化
- 宏定義的展開
-
import
的展開
- 編譯器
- 語法和語義分析
- 將符號化后的內(nèi)容轉(zhuǎn)化為一棵解析樹
- 解析樹做語義分析
- 輸出一棵抽象語法樹
- 生成代碼和優(yōu)化
- 將
AST
轉(zhuǎn)換為更低級的中間碼 (LLVM字節(jié)碼) - 對生成的中間碼做優(yōu)化
- 生成特定目標代碼
- 輸出匯編代碼
- 將
- 語法和語義分析
- 匯編器
- 將匯編代碼轉(zhuǎn)換為機器代碼狞换。它會創(chuàng)建一個目標對象文件谍珊,一般簡稱為對象文件苟翻,文件以 .o 結(jié)尾
- 鏈接器
- 將多個目標對象文件合并為一個可執(zhí)行文件 (.out)
- 運行
-
dyld
開始將可執(zhí)行文件初始化 -
runtime
遍歷所有加載進來的Class
虑椎,按繼承層級依次調(diào)用Class
的+load
方法和其Category
的+load
方法堰怨;至此贮庞,可執(zhí)行文件中和動態(tài)庫所有的符號(Class狱窘,Protocol淮韭,Selector,IMP推正,…)
都已經(jīng)按格式成功加載到內(nèi)存中恍涂,被runtime
所管理宝惰,再這之后植榕,runtime
的那些方法(動態(tài)添加 Class、swizzle 等等才能生效) -
dyld
調(diào)用main
函數(shù) - 創(chuàng)建
UIApplication
- 創(chuàng)建
UIApplication
的delegate
對象 - 開啟
runloop
- 程序啟動完畢尼夺、調(diào)用代理的
application:didFinishLaunchingWithOptions:
- 在
application:didFinishLaunchingWithOptions:
里面創(chuàng)建window
- 設(shè)置
window
的根控制器 - 顯示畫面
-