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