+load和+initialize解密

+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 方法之前
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、load方法 load方法会在runtime加载类、分类时调用(在main函数开始之前),与这个类是否用到无关...
    ychen3022阅读 831评论 0 0
  • load:当类被引用进程序的时候会执行这个函数。在一个程序开始运行之前(在main函数开始执行之前),在库开始被程...
    蜗牛也有梦想阅读 1,028评论 0 3
  • load load方法在这个文件被程序装载时调用(这个类被加入内存的时候调用),这与这个类是否被用到无关,因此lo...
    摄影师诺风阅读 477评论 0 0
  • load和initialize总结 1.+load 在文件被装载的时候调用,main函数之前;+initializ...
    攻克乃还_阅读 446评论 0 1
  • vim编辑器的使用: 输入i、a、o、s或者I、A、O、S进入编辑模式; i在光标所在字符前开始插入;a在光标所在...
    ChenME阅读 297评论 0 0