-
+load
方法會(huì)在runtime
加載分類、類時(shí)調(diào)用; (即使這個(gè)類根本沒(méi)有調(diào)用過(guò)) - 每個(gè)類荆虱、分類的
+load
都會(huì)調(diào)用,且在程序運(yùn)行過(guò)程中只調(diào)用一次;
類和分類中 +load的調(diào)用順序:
- 先調(diào)用類中的
+load
; 再調(diào)用分類的怀读;
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);
- 先調(diào)用父類中的
+load
方法诉位,再調(diào)用子類;
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
//這是一個(gè)遞歸調(diào)用菜枷,傳進(jìn)來(lái)的參數(shù)如果有父類苍糠,就會(huì)再次執(zhí)行,如果沒(méi)有啤誊,就往下執(zhí)行岳瞭。
schedule_class_load(cls->superclass);
//所以父類在list的前面
add_class_to_loadable_list(cls);
cls->setInfo(RW_LOADED);
}
- 如果沒(méi)有各類之間沒(méi)有關(guān)系,誰(shuí)先參與編譯蚊锹,先調(diào)用的
+load
方法瞳筏。
常規(guī)的方法和 +load 方法的區(qū)別 ?
- 常規(guī)方法的調(diào)用是通過(guò)消息發(fā)送機(jī)制牡昆;
-
load
方法是通過(guò)函數(shù)isa
指針直接找到方法地址姚炕。
注意:如果 寫(xiě)成了[Objcet load] ,則轉(zhuǎn)換成了消息發(fā)送機(jī)制。會(huì)先調(diào)用分類的+load
方法.
load 方法可以繼承嗎 丢烘?
- 可以柱宦。
- 可以繼承,意味著可以寫(xiě)成
[Object load]
,方法自己找不到,可以去父類找播瞳, load方法是系統(tǒng)自己調(diào)用的掸刊,即:方法原本就存在。