每个分类在编译后会生成一个category_t结构体,该结构体中存储着分类的实例方法、类方法、协议列表、属性等信息
当我们运行app时runtime运行时机制会将每个分类加到对应的类对象和元类对象里面,而且加入的时候将分类列表的数据倒序取出来,然后将里面的方法列表直接插入到rw_t的前面,之前原有的方法则挪到了最后面,这也就是为什么分类的方法(相同的方法)会优先被调用,之前说到将分类列表中的数据取出来是通过倒序,这样就说明了后编译的分类,优先被调用
class_rw_t与class_ro_t的区别:class_ro_t存储着类对象/元类原有的信息(方法、属性、协议等),也就是编译后就生成的数据(通过源码可以看出是调用realizeClass之前),class_rw_t存储着class_ro_t加上分类的信息,这里的数据可以修改,是运行时才创建的数据(调用realizeClass之后),而且平时调用方法都是从class_rw_t中查找的
分类和类扩展的区别:
类扩展是在编译完成后会存储在class_ro_t中,而分类在编译完成后只是一个个独立的category_t结构体,在运行时才会创建class_rw_t,并且将class_ro_t的数据拷贝到class_rw_t中,分类的数据也会存储在class_rw_t中