1蹲盘、分類的定義
struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct property_list_t *instaceProperties;
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);
}
分類的本質(zhì)是一個結(jié)構(gòu)體股毫,存儲類的實例方法、類方法召衔、協(xié)議铃诬、實例屬性、類屬性苍凛。
2趣席、分類的特點和作用
分類的特點
1、分類是在運行時決議
2毫深、可以為系統(tǒng)類添加分類
3吩坝、分類可以添加實例方法、類方法哑蔫、協(xié)議钉寝、屬性。添加屬性時只聲明set闸迷、get方法嵌纲,沒有對應(yīng)的實現(xiàn),不會添加成員變量腥沽。
擴展的特點
1逮走、擴展在編譯時決議
2、不可以為系統(tǒng)類添加擴展今阳,因為編譯的時候已經(jīng)決定了师溅。
3茅信、擴展可以聲明屬性、方法墓臭。
分類中+load 和 +initialize區(qū)別
1蘸鲸、load的調(diào)用時機:是runtime的加載類,在程序啟動裝載類信息的時候調(diào)用窿锉,通過函數(shù)地址直接調(diào)用酌摇,每個load都會調(diào)用且僅調(diào)用一次。
2嗡载、load方法的調(diào)用順序和方式:父類>子類>分類窑多;類中的load優(yōu)先于分類中的。每個分類中和原類中的load方法都會被調(diào)用洼滚,不會互相覆蓋埂息。
3、initialize調(diào)用時機:是通過objc_msgSend調(diào)用的判沟,只有每個類在第一次初始化的時候調(diào)用一次耿芹,如果子類中沒有實現(xiàn)initialize會去調(diào)用父類的initialize方法。分類中的initialize會覆蓋原類的實現(xiàn)挪哄。
4吧秕、initialize調(diào)用順序:在某個類第一次初始化時,會先強制為初始化過的父類調(diào)用initialize迹炼,然后本類再調(diào)用initialize砸彬。
分類的其他特點
1、分類添加的方法會覆蓋原類的方法斯入,同名分類方法誰能生效取決于編譯順序砂碉。
2、可以使用關(guān)聯(lián)對象的計數(shù)模擬為分類添加成員變量刻两。
分類的作用
1增蹭、聲明私有方法
2、分解體積龐大的類文件
3磅摹、把framework的私有方法公開化