-
+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方法是系統自己調用的,即:方法原本就存在。