dyld和objc關聯

上一篇我們講述了?dyld?的加載流程 這篇文章我們來搞清楚dyld和objc的關聯。

首先看一下objc4-781官方源碼_objc_init方法

environ_init(); //環(huán)境變量的讀取初始化?

tls_init(); //自動釋放池、runloop線程相關?

static_init(); //運行C ++靜態(tài)構造函數?

runtime_init(); //新增的。runtime運行時環(huán)境初始化?

exception_init(); //異常捕獲初始化?

cache_init(); //緩存條件初始化

?_imp_implementationWithBlock_init(); //啟動回調機制

下面著重分析下_dyld_objc_notify_register?

_dyld_objc_notify_register?這個方法是跨庫執(zhí)行的,在蘋果開源的?dyld?源碼里面可以找到,然后看到調用了?dyld::registerObjCNotifiers?這個方法:



load_images

接下來我們分析一下registerObjCNotifiers方法的第二個參數init,(也就是_dyld_objc_notify_register方法中的load_images參數)方法里面有sNotifyObjCInit = init;這個賦值語句,接下來我們在dyld源碼中全局搜索一下sNotifyObjCInit,會發(fā)現在notifySingle方法中有sNotifyObjCInit的調用:

所以在?ObjC?中?_objc_init?方法里調用的?_dyld_objc_notify_register?方法終于在?dyld?源碼中找到其真正調用的地方,終于找到了它們真正的關聯關系了。

map_images

那么_dyld_objc_notify_register方法中的map_images參數呢?接下來我們繼續(xù)找registerObjCNotifiers方法中的sNotifyObjCMapped = mapped;這一賦值語句,在dyld源碼中全局搜索一下sNotifyObjCMapped,同樣會發(fā)現在notifyBatchPartial方法中有sNotifyObjCMapped的調用:

所以說?ObjC?中?_objc_init?方法的調用時離不開?dyld?的,它們之間有著緊密的聯系。

我們還可以繼續(xù)探索一下?map_images, 進入到?objc_781?源碼,全局搜索相關的函數調用?map_images?,我們能進入相關的函數調用過程:


再進入到?map_images_nolock?方法中,我們能發(fā)現其中有很多加載相關類的信息?_read_images:


我們知道,map_images這個函數的主要功能就是為了映射相關的類信息,所以此處才是我們研究的重點,接著進入到相關的類方法的定義_read_images方法,順著源碼分析我們能得到很多關于類的信息:

??1:?條件控制進??次的加載

??2:?修復預編譯階段的?`@selector`?的混亂問題

??3:?錯誤混亂的類處理

??4:修復重映射?些沒有被鏡像?件加載進來的 類?

??5:?修復?些消息!?

??6:?當我們類??有協(xié)議的時候?: readProtocol?

??7:?修復沒有被加載的協(xié)議

??8:?分類處理

??9:?類的加載處理

??10 :?沒有被處理的類 優(yōu)化那些被侵犯的類

下篇文章繼續(xù)講解~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容