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