美文网首页
IOS +load和+initialize方法原理详解及区别

IOS +load和+initialize方法原理详解及区别

作者: 有梦想的狼 | 来源:发表于2020-01-15 17:16 被阅读0次

+load方法:

  • +load方法是通过函数指针地址来调用的。
  • +load方法会在runtime加载类、分类时调用,在程序运行过程中只调用一次。
  • 调用顺序:
    1. 先调用类的+load方法。
    按照编译先后的顺序调用。(先编译,先调用)
    调用子类的+load之前会先调用父类的+load方法。
    2. 再调用分类的+load方法。
    所有的分类都是按照编译先后的顺序调用。(先编译,先调用)

+initialize方法:

  • +initialize方法是通过objc_msgSend(消息发送机制)来调用。
  • +initialize方法是会在类第一次接收到消息时调用,在程序运行过程中只调用一次,如果没有接受到消息,则该方法就不会被调用。
  • 调用顺序:
    如果分类中实现了+initialize方法,就直接调用分类的+initialize方法。
    如果分类中没有实现+initialize方法,先调用父类的+initialize方法,再调用子类的+initialize方法。(先初始化父类,再初始化子类,每个类只会初始化一次)
    如果子类中没有实现+initialize方法,会直接调用父类的+initialize方法。(所以父类的+initialize方法可能会被调用多次)。

+load方法和+initialize的区别:

调用方式:

  • +load方法:
    是通过函数指针地址来调用的。
  • initialize方法:
    是通过objc_msgSend(消息发送机制)来调用。

调用时刻:

  • +load方法:
    是在runtime加载类、分类时调用,在程序运行过程中只调用一次。
  • +initialize方法:
    是在类第一次收到消息时调用,在程序运行过程中,如果该类没有收到消息,那么+initialize方法也不会被调用。如果子类中没有实现+initialize方法,会直接调用父类的+initialize方法。所以父类的+initialize方法可能会被调用多次,子类中的+initialize方法只调用一次。

调用顺序:

  • +load方法:
    1. 先调用类的+load方法。先编译的类,优先调用+load方法;调用子类的+load方法之前,会先调用父类的+load方法。
    2. 再调用分类的+load方法。先编译的分类,优先调用+load方法。
  • +initialize方法:
    如果存在分类,直接调用分类的+initialize方法。
    如果不存在分类,则优先调用父类的+initialize方法,再调用子类的+initialize方法。(父类中的+initialize方法有可能会被多次调用)

相关文章

网友评论

      本文标题:IOS +load和+initialize方法原理详解及区别

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