+load方法
- +load方法会在runtime加载类、分类时调用
- 每个类、分类的+load方法,在程序运行过程中只调用一次
调用顺序 - 先调用父类的load方法
- 按照编译先后顺序调用(先编译, 先调用)
- 调用子类的load之前会先调用父类的load
- 再调用分类的load
- 按照编译先后顺序调用(先编译, 先调用)
注意
+load方法是根据方法地址直接调用, 并不是经过objc_msgSend函数调用
+initialize方法
- +initialize方法: 初始化
- initialize方法会在类第一次接收到消息时调用
- 调用后记录已经初始化isInitialized, 每个类只会初始化1次
调用顺序
调用(子类的)+initialize时,
- 如果父类没有初始化, 会先调用父类的+initialize, 记录 已经初始化isInitialized
- 父类已经初始化isInitialized, 调用子类的+initialize
- 子类没有+initialize方法, 会调用父类的+initialize (所以父类的+initialize可能会调用多次)
- 分类实现了+initialize, 会覆盖类的+initialize
initialize和load有很大区别
调用方式
*load是根据函数地址直接调用
*initialize是通过objc_msgSend函数进行调用的
调用时机
*load是runtime加载类、分类的时候调用(只调用一次)
*initialize是类第一次接收到消息是调用,每个类值会初始化一次
是否调用父类的
*如果子类没有实现load方法, 就不调用了, 不会调用父类的
*如果子类没有实现initialize方法, 会调用父类的(父类的initialize可能会被调用多次)
分类中
*如果分类实现了load, 不会覆盖类本身的+load调用
*如果分类实现了initialize, 就会覆盖类本身的+initialize调用
+ initialize 方法和+load 调用时机
- load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + load 方法。
- oad 方法会被默认执行,并且是在 main 函数之前执行的。
- initialize方法第一次初始化这个类之前 被调用,我们用它来初始化静态变量。
- initialize 的调用发生在 +init 方法之前