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

  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函数对方法调用原则
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容