Category结构:
category_t的结构体中数据我们可以看到是不存在成员变量字段的,这也说明了在分类中是没办法添加成员变量的。
为什么在分类中是不能增加成员变量的?
主要原因是在class_rw_t的结构体中指向成员变量数组的指针是一个常量指针,指针常量有个特点就是指向可以改但是指向内容不可以改,所以不可以通过runtime的方式往成员变量数组中添加成员变量。
- 在类扩展新添加方法不访问类的实例变量的情况下,可以不用import引入头文件的情况下使用。
- 通过category 增加到类中的方法会被这个类的所有子类继承,就和此类的其它方法一样
分类实现原理:
分类编译之后的底层结构是struct category_t 里面存储着分类的对象方法,类方法,属性,协议信息;在程序运行的时候,runtime会将分类的数据合并到类信息中(类对象,元类对象中),将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面。
分类的特点:
如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类;
如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。
分类和类扩展的区别:
- 分类原则上只能增加方法,但是也可以通过关联属性增加属性(只是set、get方法)
- 拓展可以增加方法和属性,且都是私有的。
- 扩展只能在自身类中使用,而不是子类或者其他地方。
- 类扩展是在编译阶段将分类信息添加到类对象或者原类中,而分类是在运行时添加到类中