总结load initialize和__attribute__(

2020-04-09  本文已影响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 方法。

上一篇下一篇

猜你喜欢

热点阅读