美文网首页
Category中+load +initialize调用方法简单

Category中+load +initialize调用方法简单

作者: 仰望远处 | 来源:发表于2022-11-24 22:03 被阅读0次

    +load方法会在runtime加载类,分类的时候调用

    每个类,分类的+load 在程序运行过程中只调用一次

    调用顺序

    • 1.先调用类的+load
    1. 按照编译先后顺序调用(先编译 先调用)
    2. 调用子类的+load之前先调用父类的+load
    • 2.再调用分类的+load
      1.按照编译先后顺序调用(先编译先调用)

    +initialize的原理是通过消息转发机制实现,在类第一次接收到消息时调用.

    调用顺序

    1.先调用父类的+initialize 再调用子类的initialize

    1. objc_msgSend([TestPerson class],@selector(initialize));
        1. (先初始化父类 再初始化子类 每个类只会初始化1次)

    +initialize 是通过objc_msgSend进行调用的有以下特点:

    • 1.如果子类没有实现initialize 会调用父类的initialize(所以父类的+initialize可能会被调用多次)
    • 2.如果分类实现了+initialize 就覆盖类本身的+initialize调用

    两者区别

    - 1.调用方式

    1.)load是根据函数地址直接调用
    2.)initialize是通过objc_msgSend调用

    - 2. 调用时刻

    1.)load是runtime加载类 分类的时候调用(只会调用1次)
    2.)initialize是类第一次接收到消息的时候调用,每个类只会initialize一次(父类可能会被多次调用)

    - 3.调用顺序

    1.)load
    1> 先调用类的load
    a) 先编译的类,优先调用load
    b) 调用子类得到load之前,会先调用父类的load
    2> 再调用分类的load
    a) 先编译的分类,优先调用load

    2.)initialize
    1>先初始化父类
    2> 再初始化子类(可能最终调用的是父类的initialize方法)

    相关文章

      网友评论

          本文标题:Category中+load +initialize调用方法简单

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