美文网首页
总结load initialize和__attribute__(

总结load initialize和__attribute__(

作者: 面朝对象_春暖花开 | 来源:发表于2020-04-09 22:12 被阅读0次

    load方法是在dyld初始化objc4的时候,loadImages的时候,也就是把class装载内存的时候,分别取到需要执行load的class和category放在一个数组中,这时候我们得到:

    struct loadable_class {//需要执行load的class及load方法的地址
        Class cls;  // may be nil
        IMP method;
    };
    static struct loadable_class *loadable_classes = nil;//第一个需要执行的struct地址
    static int loadable_classes_used = 0;//连续多少个struct
    static int loadable_classes_allocated = 0;//所占空间= loadable_classes_used * 2*16
    
    //category的同上
    struct loadable_category {//需要执行load的category及load方法的地址
        Category cat;  // may be nil
        IMP method;
    };
    static struct loadable_category *loadable_categories = nil;
    static int loadable_categories_used = 0;
    static int loadable_categories_allocated = 0;
    

    然后执行call_load_methods , 分别遍历loadable_classes和loadable_categories,拿到class和IMP,调用方式:直接函数指针


    image.png

    initialize 是在你使用class的时候调用,对应方法:_class_initialize,基本上每次使用都会调用,只不过只会执行一次,因为有个状态标识是否执行过了initialize,这个状态就是

     bool isInitialized() {
            return getMeta()->data()->flags & RW_INITIALIZED;
        }
    

    attribute((constructor))
    constructor 和 +load 都是在 main 函数执行前调用,但 +load 比 constructor 更加早一丢丢,因为 dyld(动态链接器,程序的最初起点)在加载 image(可以理解成 Mach-O 文件)时会先通知 objc runtime 去加载其中所有的类,每加载一个类时,它的 +load 随之调用,全部加载完成后,dyld 才会调用这个 image 中所有的 constructor 方法。

    相关文章

      网友评论

          本文标题:总结load initialize和__attribute__(

          本文链接:https://www.haomeiwen.com/subject/qioqmhtx.html