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


    分类
    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)


  • 相关阅读:
    while 循环及 break,continue语句
    Binary Search Tree BST Template
    Largest Rectangle in Histogram 解答
    Increasing/ Decreasing Stack
    Stack
    Queue
    Find the largest multiple of 3 解答
    Check whether a given Binary Tree is Complete or not 解答
    Sliding Window Maximum 解答
    Wiggle Sort 解答
  • 原文地址:https://www.cnblogs.com/huangzs/p/10208204.html
Copyright © 2020-2023  润新知