一、類別(Categroy)
再將類別之前陈瘦,先介紹一下為什么要使用類別幌甘。
在開發(fā)大型項目中,企業(yè)級開發(fā)中多人同時維護同一個類痊项,此時程序員A因為某項需求只想給當前類添加一個方法锅风,那該怎么辦呢?
當然最簡單粗暴的方式是把newMethod添加到currentClass中鞍泉,然后直接實現(xiàn)該方法就OK了皱埠。
但考慮到OC是單繼承的,子類可以擁有父類的方法和屬性咖驮。而這個方法只有這個類需要边器,而它的子類不需要训枢。那么就可以用類別
還有,如果你覺得系統(tǒng)提供的類太過局限忘巧,不能達到你的要求恒界,你還想實現(xiàn)別的功能,但是你還不能修改系統(tǒng)提供的方法砚嘴,這個時候十酣,你就可以發(fā)揮OC動態(tài)語言的特性,添加一個類別
蘋果為了解決這個問題际长,就引入了分類(Category)的概念耸采。
Category的注意點:
- Category的小括號內一定要有名字;故Class Extension亦被稱之為匿名分類;
#import
@interface 類名(分類名字)
/* 方法聲明*/
@end
@implement 類名(分類名字)
/*方法實現(xiàn)*/
@end
- Category的方法不一定非要在@implement中實現(xiàn),也可以在其他位置中實現(xiàn),但是當調用Category的方法時,依據(jù)繼承樹沒有找到該方法的實現(xiàn),程序則會崩潰;并且,Category的方法優(yōu)先級較高,可以覆蓋原類的方法;
- Category的方法中,不可以調用super方法;
- 在實際開發(fā)中要注意的是,Category 方法可能會覆蓋于同一個類class 的其它 category 中的方法。但也可能被覆蓋也颤,因為不法預知他們的加載優(yōu)先順序洋幻,出現(xiàn)這種情況通常會在編譯時出錯。如果在一個開發(fā)的SDK中使用了類別翅娶, 就最好保證類別名不同于使用者的類別名以及類別方法也不同于使用者的類別方法名文留, 通常通過加前綴來做到。
- 分類中的可以寫@property, 但不會生成setter/getter方法, 也不會生成實現(xiàn)以及私有的成員變量(編譯時會報警告),但是可以使用@dynamic(即運行時Runtime)來彌補這種不足.
二竭沫、類擴展(Class Extension)
Extension是Category的一個特例燥翅。類擴展與分類相比只少了分類的名稱,所以稱之為“匿名分類”蜕提。其實開發(fā)當中森书,我們幾乎天天在使用。對于有些人來說像是最熟悉的陌生人谎势。
- 作用:
- 能為某個類添加成員變量,屬性,方法;
- 一般的類擴展寫到.m文件中;
- 一般的私有屬性寫到類擴展中
#import
@interface myClass()
{
// 成員變量
}
// 屬性
// 方法
@end
@implement
@end
Category和Extension的區(qū)別
- Category的小括號中有名字,而Extension沒有;
- Category只能擴充方法,不能擴充成員變量和屬性;
- 如果Category聲明了一個屬性,那么Category只會生成這個屬性的set,get方法的聲明,也就不是會實現(xiàn).
- 類擴展不能像類別那樣擁有獨立的實現(xiàn)部分(@implementation部分)凛膏,也就是說,類擴展所聲明的方法必須依托對應類的實現(xiàn)部分來實現(xiàn)脏榆。
- 定義在 .m 文件中的類擴展方法為私有的猖毫,定義在 .h 文件(頭文件)中的類擴展方法為公有的。類擴展是在 .m 文件中聲明私有方法的非常好的方式须喂。