一、類(lèi)別(Categroy)
再將類(lèi)別之前,先介紹一下為什么要使用類(lèi)別。
在開(kāi)發(fā)大型項(xiàng)目中,企業(yè)級(jí)開(kāi)發(fā)中多人同時(shí)維護(hù)同一個(gè)類(lèi),此時(shí)程序員A因?yàn)槟稠?xiàng)需求只想給當(dāng)前類(lèi)添加一個(gè)方法,那該怎么辦呢?
當(dāng)然最簡(jiǎn)單粗暴的方式是把newMethod添加到currentClass中,然后直接實(shí)現(xiàn)該方法就OK了。
但考慮到OC是單繼承的,子類(lèi)可以擁有父類(lèi)的方法和屬性。而這個(gè)方法只有這個(gè)類(lèi)需要,而它的子類(lèi)不需要。那么就可以用類(lèi)別
還有,如果你覺(jué)得系統(tǒng)提供的類(lèi)太過(guò)局限,不能達(dá)到你的要求,你還想實(shí)現(xiàn)別的功能,但是你還不能修改系統(tǒng)提供的方法,這個(gè)時(shí)候,你就可以發(fā)揮OC動(dòng)態(tài)語(yǔ)言的特性,添加一個(gè)類(lèi)別
蘋(píng)果為了解決這個(gè)問(wèn)題,就引入了分類(lèi)(Category)的概念。
Category的注意點(diǎn):
- Category的小括號(hào)內(nèi)一定要有名字;故Class Extension亦被稱(chēng)之為匿名分類(lèi);
#import
@interface 類(lèi)名(分類(lèi)名字)
/* 方法聲明*/
@end
@implement 類(lèi)名(分類(lèi)名字)
/*方法實(shí)現(xiàn)*/
@end
- Category的方法不一定非要在@implement中實(shí)現(xiàn),也可以在其他位置中實(shí)現(xiàn),但是當(dāng)調(diào)用Category的方法時(shí),依據(jù)繼承樹(shù)沒(méi)有找到該方法的實(shí)現(xiàn),程序則會(huì)崩潰;并且,Category的方法優(yōu)先級(jí)較高,可以覆蓋原類(lèi)的方法;
- Category的方法中,不可以調(diào)用super方法;
- 在實(shí)際開(kāi)發(fā)中要注意的是,Category 方法可能會(huì)覆蓋于同一個(gè)類(lèi)class 的其它 category 中的方法。但也可能被覆蓋,因?yàn)椴环A(yù)知他們的加載優(yōu)先順序,出現(xiàn)這種情況通常會(huì)在編譯時(shí)出錯(cuò)。如果在一個(gè)開(kāi)發(fā)的SDK中使用了類(lèi)別, 就最好保證類(lèi)別名不同于使用者的類(lèi)別名以及類(lèi)別方法也不同于使用者的類(lèi)別方法名, 通常通過(guò)加前綴來(lái)做到。
- 分類(lèi)中的可以寫(xiě)@property, 但不會(huì)生成setter/getter方法, 也不會(huì)生成實(shí)現(xiàn)以及私有的成員變量(編譯時(shí)會(huì)報(bào)警告),但是可以使用@dynamic(即運(yùn)行時(shí)Runtime)來(lái)彌補(bǔ)這種不足.
二、類(lèi)擴(kuò)展(Class Extension)
Extension是Category的一個(gè)特例。類(lèi)擴(kuò)展與分類(lèi)相比只少了分類(lèi)的名稱(chēng),所以稱(chēng)之為“匿名分類(lèi)”。其實(shí)開(kāi)發(fā)當(dāng)中,我們幾乎天天在使用。對(duì)于有些人來(lái)說(shuō)像是最熟悉的陌生人。
- 作用:
- 能為某個(gè)類(lèi)添加成員變量,屬性,方法;
- 一般的類(lèi)擴(kuò)展寫(xiě)到.m文件中;
- 一般的私有屬性寫(xiě)到類(lèi)擴(kuò)展中
#import
@interface myClass()
{
// 成員變量
}
// 屬性
// 方法
@end
@implement
@end
Category和Extension的區(qū)別
- Category的小括號(hào)中有名字,而Extension沒(méi)有;
- Category只能擴(kuò)充方法,不能擴(kuò)充成員變量和屬性;
- 如果Category聲明了一個(gè)屬性,那么Category只會(huì)生成這個(gè)屬性的set,get方法的聲明,也就不是會(huì)實(shí)現(xiàn).
- 類(lèi)擴(kuò)展不能像類(lèi)別那樣擁有獨(dú)立的實(shí)現(xiàn)部分(@implementation部分),也就是說(shuō),類(lèi)擴(kuò)展所聲明的方法必須依托對(duì)應(yīng)類(lèi)的實(shí)現(xiàn)部分來(lái)實(shí)現(xiàn)。
- 定義在 .m 文件中的類(lèi)擴(kuò)展方法為私有的,定義在 .h 文件(頭文件)中的類(lèi)擴(kuò)展方法為公有的。類(lèi)擴(kuò)展是在 .m 文件中聲明私有方法的非常好的方式。