laod和initialize

laod和initialize

+load

+load方法会在runtime加载类、分类时调用,每个类、分类的+load,在程序运行过程中只调用一次,+load方法是根据方法地址直接调用,并不是经过objc_msgSend函数调用。

调用顺序

  1. 先调用子类的+load,按照编译先后顺序调用(先编译,先调用),调用子类的+load之前会先调用父类的+load
  2. 再调用分类的+load,按照编译先后顺序调用(先编译,先调用)
+initialize

+initialize方法会在类第一次接收到消息时调用

调用顺序
先调用父类的+initialize,再调用子类的+initialize(先初始化父类,再初始化子类,每个类只会初始化1次)

load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?

+initialize和+load的最大区别是,+initialize是通过objc_msgSend进行调用的,所以有以下特点

  1. 如果子类没有实现+initialize,会调用父类的+initialize(所以父类的+initialize可能会被调用多次)
  2. 如果分类实现了+initialize,就覆盖类本身的+initialize调用
  3. load是根据函数地址直接调用,initialize是通过objc_msgSend调用
  4. load是runtime加载类、分类的时候调用(只会调用1次),initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)
  5. load先调用类的load,先编译的类,优先调用load,调用子类的load之前,会先调用父类的load,再调用分类的load,先编译的分类,优先调用load。initialize先初始化父类,再初始化子类(可能最终调用的是父类的initialize方法)

你可能感兴趣的:(laod和initialize)