整個app從點擊到執(zhí)行到系統(tǒng)main函數(shù)之前的過程圖

但今天主要記錄的是notify_register函數(shù)之后的執(zhí)行

load_images
作?:執(zhí)?類和分類的 load ?法,如果類實現(xiàn)了load方法,此時就會進行加載
load?法總結(jié)
1.當?類和?類都實現(xiàn)load函數(shù)時,?類的load?法執(zhí)?順序要優(yōu)先于?類
2.當?個類未實現(xiàn)load?法時,不會調(diào)??類load?法
3.類中的load?法執(zhí)?順序要優(yōu)先于分類(Category)
4.load?法使?了鎖,所以是線程安全的。
5.當有多個類別(Category)都實現(xiàn)了load?法,這?個load?法都會執(zhí)?,但執(zhí)?順序不確定(其執(zhí)?順序與類別在Compile Sources中出現(xiàn)的順序?致)
6.當然當有多個不同的類的時候,每個類load 執(zhí)?順序與其在Compile Sources出現(xiàn)的順序?致
map_images
作?:進?類的初始化。
關鍵函數(shù) read_images 流程
1: 加載所有類到類的表中。
2: 對所有類做重映射。
3: 將所有SEL都注冊到namedSelectors表中。
4: 修復函數(shù)指針遺留。
5: 將所有Protocol都添加到protocol_map表中。
6: 對所有Protocol做重映射。
7: 初始化所有?懶加載的類,進?rw、ro等操作。
8:遍歷已標記的懶加載的類,并做初始化操作。
9:處理所有Category,包括Class和Meta Class。
10:初始化所有未初始化的類。
在源碼的dyld中對于各類可變更區(qū)域和不可變的生效分配也在此進行了

在此可以看到,系統(tǒng)在加載類的時候,如果分類為非懶加載模式,比如有實現(xiàn)load方法等,在此時就會直接開辟rew可動態(tài)修改類區(qū)域。否則都暫時存儲在rw中,等遇到具體場景的時候,再重新開辟rew
類和分類是否為懶加載,dyld加載期間的具體情況
