1.分類只能增加方法(包括類方法和對象方法),不能增加成員變量
2.在分類方法的實現(xiàn)中可以訪問原來類中的成員變量;
3.分類中可以重新實現(xiàn)原來類中的方法,但是會覆蓋掉原來的方法(+load除外),導致原來的方法無法再使用(警告);
著重說下這個,盡量不要在分類中重寫原類的方法,理由如下:
(1)、category沒有辦法去代替子類,它不能像子類一樣通過super去調用父類的方法實現(xiàn)。如果category中重寫覆蓋了當前類中的某個方法,那么這個當前類中的原始方法實現(xiàn),將永遠不會被執(zhí)行,這在某些方法里是致命的,但是如果子類實現(xiàn)了該方法,則子類的方法會覆蓋掉分類和父類。(ps:這里提一下,+(void)load方法是一個特例,它會在當前類執(zhí)行完之后再在category中執(zhí)行。)
+(void)load方法,執(zhí)行順序:先調用父類,再調用子類,最后調用分類。
其他方法執(zhí)行順序:有子類則只執(zhí)行子類,沒有子類則只執(zhí)行分類。
(2)、同時,一個category也不能可靠的覆蓋另一個category中相同的類的相同的方法。例如UIViewController+A與UIViewController+B,都重寫了viewDidLoad,我們就無法控制誰覆蓋了誰。
(3)、通過觀察頭文件我們可以發(fā)現(xiàn),Cocoa框架中的許多類都是通過category來實現(xiàn)功能的,可能不經(jīng)意間你就覆蓋了這些方法中的其一,有時候就會產(chǎn)生一些無法排查的異常原因。
(4)、category的誕生只是為了讓開發(fā)者更加方便的去拓展一個類,它的初衷并不是讓你去改變一個類。
結論:
當我們需要重寫方法時,首推通過子類重寫父類的方法,在一些不方便重寫的情況下,我們也可以在category中用runtime進行method swizzling(方法的偷梁換柱)來實現(xiàn)。
4.方法調用的優(yōu)先級:分類->原來的類->父類,若包含有多個分類,則最后參與編譯的分類優(yōu)先;
5.在很多的情況下,往往是給系統(tǒng)自帶的類添加分類,如NSObject和NSString,因為有的時候,系統(tǒng)類可能并不能滿足我們的要求。
6.在大規(guī)模的應用中,通常把相應的功能寫成一個分類,可以有無限個分類,對原有類進行擴充,一般分模塊寫,一個模塊一個分類。