主要是依赖关系。

调用的顺序

你过去可能会听说过,对于 ​​load​​ 方法的调用顺序有两条规则:

  1. 父类先于子类调用
  2. 类先于分类调用

这种现象是非常符合我们的直觉的,我们来分析一下这种现象出现的原因。

第一条规则是由于 ​​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



------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。