1. 程式人生 > >分類和擴充套件有什麼區別?可以分別用來做什麼?分類有哪些侷限性?分類的結構體裡面有哪些成員?

分類和擴充套件有什麼區別?可以分別用來做什麼?分類有哪些侷限性?分類的結構體裡面有哪些成員?

1、分類中原則上只能增加方法(能新增屬性的的原因只是通過runtime的objc_setAssociatedObject和objc_getAssociatedObject方法新增setter/getter方法);
2、擴充套件不僅可以增加方法,還可以增加例項變數(或者屬性),只是該例項變數預設是@private型別的(用範圍只能在自身類,而不是子類或其他地方); 3、擴充套件中宣告的方法沒被實現,編譯器會報警,但是分類中的方法沒被實現編譯器是不會有任何警告的。這是因為擴充套件是在編譯階段被新增到類中,而分類是在執行時新增到類中。 4、 擴充套件不能像分類那樣擁有獨立的實現部分(@implementation部分),也就是說,擴充套件所宣告的方法必須依託對應類的實現部分來實現。
5、定義在 .m 檔案中的擴充套件方法為私有的,定義在 .h 檔案(標頭檔案)中的擴充套件方法為公有的。擴充套件是在 .m 檔案中宣告私有方法的非常好的方式。  

    typedef struct objc_category *Category;

    struct objc_category {

        char *category_name                          OBJC2_UNAVAILABLE; // 分類名

        char *class_name                             OBJC2_UNAVAILABLE; // 分類所屬的類名

        struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 例項方法列表

        struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 類方法列表

        struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分類所實現的協議列表

    }