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

分类
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 文件中声明私有方法的非常好的方式
缺点
(1)、必须有类的源码才可以给类添加extension,所以对于系统一些类,如nsstring,就无法添加类扩展
 
struct objc_category {
    char * _Nonnull category_name                            OBJC2_UNAVAILABLE;
    char * _Nonnull class_name                               OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable instance_methods     OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable class_methods        OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
    const struct _prop_list_t *properties;  // 属性列表不是实例变量列表没有set get的实现

}

 



 

posted @ 2019-01-02 14:02  黄增松  阅读(1597)  评论(0编辑  收藏  举报