load 與 initialize

load

調(diào)用時(shí)機(jī):app啟動(dòng)時(shí) 動(dòng)態(tài)庫加載的時(shí)候(在main函數(shù)之前調(diào)用)

調(diào)用順序:父類->父類 -> 本類 -> 分類

  1. 其中沒有實(shí)現(xiàn)+load方法的類就跳過
  1. 如:入父類a->父類b->本類->分類(其中b繼承ab沒有實(shí)現(xiàn)+load 則調(diào)用:父類a->本類->分類)
  1. 全部分類都會(huì)調(diào)用,其調(diào)用順序由Compile Source順序決定

具體剖析: 直接調(diào)用IMP 函數(shù)指針

  1. 類加載的時(shí)候,先調(diào)用 objc_init(void)

  2. 每當(dāng)有新的 library 被 map 到 runtime 時(shí),調(diào)用 load_images 方法。

  3. load_images

    1. perpar_load_methods() 主類的父類和自身添加到全局靜態(tài)結(jié)構(gòu)體 loadable_list 中之后,添加主類的分類,將分類添加到全局靜態(tài)結(jié)構(gòu)體 loadable_categories 中。所以子類優(yōu)先分類。

      1. 上了線程安全:遞歸鎖 (recursive_mutex_t
      1. 添加本類(本類中的include的類 且沒有執(zhí)行過+load)及父類。。。父類到loadable_List中。
        (遞歸調(diào)用schedule_class_load -> 父類。。。添加到loadable_List
      2. 添加categoryloadabel_categorys
    2. call_load_methods();當(dāng)library加載完成后,需要調(diào)用call_load_methods

      1. objc_autoReleasePoolPush創(chuàng)建一個(gè)pool。
      1. do while 循環(huán)調(diào)用父類->本類->分類 的 +load 方法。(loadable_classes_used->為一個(gè)全局的指針偏移變量并在每次錄入方法后做自加操作實(shí)現(xiàn)索引的偏移。)
      1. 循環(huán)中call_class_loads 調(diào)用 父本類+load
      1. 循環(huán)中call_category_loads 調(diào)用本類所有實(shí)現(xiàn)了load方法的分類的 + load方法
      *   獲取當(dāng)前可以加載的分類列表
          
          
      *   如果當(dāng)前類是可加載的 `cls && cls->isLoadable()` 就會(huì)調(diào)用分類的 load 方法
          
          
      *   將所有加載過的分類移除 `loadable_categories` 列表
          
          
      *   為 `loadable_categories` 重新分配內(nèi)存,并重新設(shè)置它的值
      

initializy

調(diào)用時(shí)機(jī) :第一次接收到消息的時(shí)候(objc_msgSend的時(shí)候)

調(diào)用順序:父類->本類->分類

  1. 本類繼承父類的實(shí)現(xiàn)
  1. 分類重寫后會(huì)覆蓋本類實(shí)現(xiàn),只會(huì)調(diào)用一個(gè)分類(分類存在Compile Sources表中的最后一個(gè)會(huì)調(diào)用)

調(diào)用本質(zhì)objc_msgSend

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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