美文网首页
+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