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