zoukankan      html  css  js  c++  java
  • load 调用的顺序

    主要是依赖关系。

    调用的顺序

    你过去可能会听说过,对于 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
    链接:https://www.jianshu.com/p/6d9a99ba3f06
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    网页制作-表单元素2
    网页制作-表单元素
    网页制作_表格
    网页制作常用标签
    IT新起之秀
    Android Studio 快捷键
    android github
    手机抓包 http tcp udp?
    Ubuntu16.04 Caffe 安装步骤记录(超详尽)(转载)
    ubuntu16.04 在cuda9.0环境下编译安装opencv2.4.13.7
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8259152.html
Copyright © 2011-2022 走看看