Category

作者: Peter杰 | 来源:发表于2020-09-29 14:16 被阅读0次
    1. Category实现原理
    • Category编译之后的底层结构是struct category_t,里面存储这分类的对象方法、类方法、属性、协议信息。
    • 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)
    • 加载处理过程
      1. 通过Runtime加载某个类的所有Category数据,
      2. 把所以Category的方法、属性、协议数据,合并到一个大数组中,后面参与编译的Category数据,会在数组的前面
    2. Category和Class Extension的区别是什么?
    • Class Extension在编译的时候,它的数据已经包含在类信息中,
    • Category是在运行时,才会将数据整合并到类信息中
    3. +load调用时间及调用顺序
    • +load方法会在runtime加载类、分类时调用
    • 每个类、分类的load,在程序运行过程中调用一次
    • 调用顺序
      • 先调用类的+load
        按照编译先后顺序调用(先编译,先调用)
        调用子类的+load之前会先调用父类的+load
      • 再调用分类的+load
        按照编译先后顺序调用(先编译,先调用)
    4. initialize方法
    • +initialize方法会在类第一次收到消息时调用
    • 调用顺序
      • 先调用父类的+initialize,再调用子类的+initialize
        (先初始化父类,再初始化子类,每个类只会初始化1次)
    5.+initialize和+load的区别

    +initialize和+load的很大区别是,+initialize是通过objc_msgSend进行调用的,所以有以下特点

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

    相关文章

      网友评论

          本文标题:Category

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