Category

  • Category的实现原理:
    Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息,在程序运行时,才会将数据合并到类信息中。
    category的底层结构.png
  • 以方法列表为例,首先根据分类数量将方法列表数组进行扩容,将原来的方法列表数据放到后面,再将分类的数据拷贝到原来方法列表的位置,所以同样的方法会优先调用分类的方法。


    Category的加载处理过程.png
  • Category和Class Extension的区别是什么?
    Class Extension在编译的时候,它的数据就已经包含在类信息中
    Category是在运行时,才会将数据合并到类信息中(类对象、元类对象中)
  • 在类与分类中调用+ (void)load方法,不是通过消息机制,去类对象中通过isa找到元类对象,遍历类方法列表查找,而是直接通过load方法在内存中的地址进行调用的,不存在分类的load方法覆盖类的方法。


    load方法.png

    +initialize方法.png

你可能感兴趣的:(Category)