#warning 不要在category中重寫方法
在iOS開發中,category(類目、類別)是一個很好用的東西。(純文字,短小而精罕)
我們可以給一個類添加方法和屬性。好比如NSDateFormatter這玩意每次都new開銷是非常大的,這在tableview中的體現尤為明顯,有了category我們就可以為他寫一個單例,避免了每次都為它開辟新的內存。
于是,我們想,如果用category去重寫該類的方法,會怎樣?實測可行,果然被覆蓋了。。。但是,作為祖國未來的花朵,我們不能這么干!
理由如下:
1、category沒有辦法去代替子類,它不能像子類一樣通過super去調用父類的方法實現。如果category中重寫覆蓋了當前類中的某個方法,那么這個當前類中的原始方法實現,將永遠不會被執行,這在某些方法里是致命的。(ps:這里提一下,+(void)load方法是一個特例,它會在當前類執行完之后再在category中執行。)
2、同時,一個category也不能可靠的覆蓋另一個category中相同的類的相同的方法。例如UIViewController+A與UIViewController+B,都重寫了viewDidLoad,我們就無法控制誰覆蓋了誰。
3、通過觀察頭文件我們可以發現,Cocoa框架中的許多類都是通過category來實現功能的,可能不經意間你就覆蓋了這些方法中的其一,有時候就會產生一些無法排查的異常原因。
4、category的誕生只是為了讓開發者更加方便的去拓展一個類,它的初衷并不是讓你去改變一個類。
結論:
要重寫方法,當然我們首推通過子類重寫父類的方法,在一些不方便重寫的情況下,我們也可以在category中用runtime進行method swizzling(方法的偷梁換柱)來實現。