主要是依赖关系。
调用的顺序
你过去可能会听说过,对于 load
方法的调用顺序有两条规则:
- 父类先于子类调用
- 类先于分类调用
这种现象是非常符合我们的直觉的,我们来分析一下这种现象出现的原因。
第一条规则是由于 schedule_class_load
有如下的实现:
static void schedule_class_load(Class cls)
{
if (!cls) return;
assert(cls->isRealized());
if (cls->data()->flags & RW_LOADED) return;
schedule_class_load(cls->superclass);
add_class_to_loadable_list(cls);
cls->setInfo(RW_LOADED);
}
这里通过这行代码 schedule_class_load(cls->superclass)
总是能够保证没有调用 load
方法的父类先于子类加入 loadable_classes
数组,从而确保其调用顺序的正确性。
类与分类中 load
方法的调用顺序主要在 call_load_methods
中实现:
do {
while (loadable_classes_used > 0) {
call_class_loads();
}
more_categories = call_category_loads();
} while (loadable_classes_used > 0 || more_categories);
上面的 do while
语句能够在一定程度上确保,类的 load
方法会先于分类调用。但是这里不能完全保证调用顺序的正确。
如果分类的镜像在类的镜像之前加载到运行时,上面的代码就没法保证顺序的正确了,所以,我们还需要在 call_category_loads
中判断类是否已经加载到内存中(调用 load
方法):
作者:Draveness
链接:https://www.jianshu.com/p/6d9a99ba3f06
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。