美文网首页
+load和+initialize解密

+load和+initialize解密

作者: JoliLove | 来源:发表于2018-11-06 13:27 被阅读24次

+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 方法之前

相关文章

网友评论

      本文标题:+load和+initialize解密

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