美文网首页
关于 +load方法和+initialize方法的要点

关于 +load方法和+initialize方法的要点

作者: Gxdy | 来源:发表于2018-09-04 11:25 被阅读0次
    1. 附加:关于objc_msgSend函数对方法调用的的简单说明
    1. objc_msgSend是runtime 消息发送机制,oc中大多数方法的调用本质上都是通过它来实现
    2. 方法调用是通过顺序遍历类对象或元类对象的方法数组中的函数,所以在前面的函数优先调用。
    3. 同时,方法在数组中的顺序则是后编译的分类--先编译的分类-类的方法
    4. 另外 方法调用时,如果子类不存在则会通过superclass指针去访问父类的方法数组
    1. + load方法
    • 调用时刻:
      load是在runtime加载类、分类时调用(可以看成程序启动时)
    • 调用方式 :
      +load方法是系统根据方法地址直接调用,并不是经过objc_msgSend函数调用。但如果程序员手动调用时,则会经过objc_msgSend函数调用
    • 调用次数
      每个类、分类的+load,在程序运行过程中只调用一次
    • 调用顺序(系统自动调用)
      1.先调用的+load
      a> 按照编译先后顺序调用(先编译,先调用
      b> 调用子类+load之前会先调用父类的+load
      2.再调用分类的+load
      按照编译先后顺序调用(先编译,先调用
    1. + initialize方法
    • 调用时刻:
      +initialize第一次接收到消息的时候调用
    • 调用方式 :
      + initialize方法是经过objc_msgSend函数调用
    • 调用次数
      每一个类只会initialize一次,但是父类的initialize方法可能会被调用多次(子类没有实现时,会通过superClass去调用父类的initialize)
    • 调用顺序
      1> 先初始化父类 ()
      2> 再初始化子类(如果子类没有实现就会调用父类的initialize方法 --> 继承
      3> 如果分类也实现了+initialize,则只会调用分类的+initialize,遵循objc_msgSend函数对方法调用原则

    相关文章

      网友评论

          本文标题:关于 +load方法和+initialize方法的要点

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