load方法解析

  • +load方法會在runtime加載分類、類時調用; (即使這個類根本沒有調用過)
  • 每個類、分類的+load都會調用,且在程序運行過程中只調用一次;

類和分類中 +load的調用順序:
  • 先調用類中的+load; 再調用分類的;
 do {
        // 1. Repeatedly call class +loads until there aren't any more
        while (loadable_classes_used > 0) {
            call_class_loads();
        }

        // 2. Call category +loads ONCE
        more_categories = call_category_loads();

        // 3. Run more +loads if there are classes OR more untried categories
    } while (loadable_classes_used > 0  ||  more_categories);
  • 先調用父類中的+load方法,再調用子類;
static void schedule_class_load(Class cls)
{
    if (!cls) return;
    assert(cls->isRealized());  // _read_images should realize

    if (cls->data()->flags & RW_LOADED) return;

    // Ensure superclass-first ordering
   //這是一個遞歸調用,傳進來的參數如果有父類,就會再次執行,如果沒有,就往下執行。
    schedule_class_load(cls->superclass);
  
    //所以父類在list的前面 
    add_class_to_loadable_list(cls);
    cls->setInfo(RW_LOADED); 
}

  • 如果沒有各類之間沒有關系,誰先參與編譯,先調用的+load方法。

常規的方法和 +load 方法的區別 ?
  • 常規方法的調用是通過消息發送機制;
  • load方法是通過函數isa指針直接找到方法地址。

注意:如果 寫成了[Objcet load] ,則轉換成了消息發送機制。會先調用分類的+load方法.


load 方法可以繼承嗎 ?
  • 可以。
  • 可以繼承,意味著可以寫成[Object load],方法自己找不到,可以去父類找, load方法是系統自己調用的,即:方法原本就存在。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容