分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?

分类
1、原则上只能增加方法(能添加属性的的原因只是通过runtime的objc_setAssociatedObject和objc_getAssociatedObject方法添加setter/getter方法)
2、方法没被实现编译器不会有任何警告,因为分类是在运行时添加到类中
3、可以减少单个文件的体积
4、把不同功能组织到不同的Category里
5、可以由多个开发者共同完成一个类
6、可以按需加载想要的category
7、声明私有方法
缺点

(1)无法向类中添加新的实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。
(3)如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法

 
扩展
1、不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的(使用范围只能在自身类,而不是子类或其他地方)
2、声明的方法没被实现,编译器会报警,因为扩展是在编译阶段被添加到类中
3、定义在 .m 文件中的扩展方法为私有的,定义在 .h 文件(头文件)中的扩展方法为公有的。扩展是在 .m 文件中声明私有方法的非常好的方式
 
 

    struct category_t {

        const char *name;

        classref_t cls;

        struct method_list_t *instanceMethods; // 对象方法

        struct method_list_t *classMethods; // 类方法

        struct protocol_list_t *protocols; // 协议

        struct property_list_t *instanceProperties; // 属性

        // Fields below this point are not always present on disk.

        struct property_list_t *_classProperties;

        

        method_list_t *methodsForMeta(bool isMeta) {

            if (isMeta) return classMethods;

            else return instanceMethods;

        }

        

        property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);

    };

1)类的名字(name)
2)类(cls)
3)category中所有给类添加的实例方法的列表(instanceMethods)
4)category中所有添加的类方法的列表(classMethods)
5)category实现的所有协议的列表(protocols)
6)category中添加的所有属性(instanceProperties)


原文地址:https://www.cnblogs.com/huangzs/p/10208204.html