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