從dyld過程看類、分類、ro、rwe

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


dyld流程分析圖.png

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


image.png

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ū)域和不可變的生效分配也在此進行了


image.png

在此可以看到,系統(tǒng)在加載類的時候,如果分類為非懶加載模式,比如有實現(xiàn)load方法等,在此時就會直接開辟rew可動態(tài)修改類區(qū)域。否則都暫時存儲在rw中,等遇到具體場景的時候,再重新開辟rew
類和分類是否為懶加載,dyld加載期間的具體情況
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容