分類和擴展有什么區別?可以分別用來做什么?分類有哪些局限性?分類的結構體里面有哪些成員?


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


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM