Category的实现原理是什么?
Category编译之后的底层结构是 struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息
在程序运行的时候,runtime会将Category的数据合并到类对象(元类对象中)
Category 和 Extension 的区别是什么?
Class Extension 在编译的时候,他的数据(对象方法、类方法、属性、协议信息)就已经包含在类对象(元类对象)中
Category在程序运行时才会将数据(对象方法、类方法、属性、协议信息)合并到类对象(元类对象)中
Category 的加载处理过程:
通过Runtime加载某个类的所有分类数据
把所有Category的方法、属性、协议数据合并到一个大数组中(后参加编译的Category数据,会在数组前面)
将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面
备注:分类中的实例方法,类方法在程序运行时(通过runtime动态)将实例方法合并到类对象中,类方法合并到元类对象中。同样的方法会优先调用分类方法(分类中的方法在合并到类/元类对象的方法列表时,是插入在方法列表前面 —> 内存偏移memmove、memcpy)、分类中相同的方法谁后编译就先执行谁。