分類(category)又稱非正式協(xié)議
Objective-C 中的 category 就是對(duì)裝飾模式的一種具體實(shí)現(xiàn)。它的主要作用是在不改變?cè)蓄惖那疤嵯?,擴(kuò)展已有的類,比如有大量的子類,需要添加公用方法,但又無(wú)法修改它們的父類的情形。
分類有以下特點(diǎn):
1.由于分類的結(jié)構(gòu)體指針中,沒(méi)有屬性列表,只有?法列列表。所以原則上講它只能添加方法, 不能添加屬性(成員變量量),但是實(shí)際上可以通過(guò)其它?式添加屬性 (后面會(huì)提到)
2.雖然分類不能添加屬性,但是分類中的可以寫(xiě)@property, 只是不會(huì)?成setter/getter?方法, 也不會(huì)?成實(shí)例變量,會(huì)編譯通過(guò),但是引用變量會(huì)報(bào)錯(cuò);
3.如果分類中有和原有類同名的方法, 會(huì)優(yōu)先調(diào)?分類中的方法, 就是說(shuō)會(huì)忽略原有類的方法,同名方法調(diào)用的優(yōu)先級(jí)為: 分類 > 本類 > 父類;
4.如果多個(gè)分類中都有和原有類中同名的?法, 那么調(diào)?該方法的時(shí)候執(zhí)行誰(shuí)由編譯器決定;編譯器會(huì)執(zhí)?最后?個(gè)參與編譯的分類中的?法。
擴(kuò)展(extension)
類擴(kuò)展可以理解為Category的其中的一種,可以用來(lái)給當(dāng)前類添加屬性和新方法。在iOS -@interface/@implementation
有提到,所以在這里說(shuō)一下兩個(gè)的區(qū)別:
類擴(kuò)展的屬性和方法都是私有的,類擴(kuò)展中的方法是一定要實(shí)現(xiàn)的方法,category沒(méi)有限制,但是category不能直接添加屬性
協(xié)議(protocol)
了解Java的話,可以這樣理解protocol:類似于java的接口interface,接口就是一堆方法的聲明,沒(méi)有實(shí)現(xiàn),在OC中接口是由一個(gè)叫做協(xié)議的Protocol來(lái)實(shí)現(xiàn),其實(shí)就算你不了解Java,但是這句話也已經(jīng)解釋了什么是協(xié)議,那么協(xié)議是如何寫(xiě)的呢。
協(xié)議的定義:
@protocol TestViewControllerDelegate <NSObject>
- (void) showMeTarget:(NSInteger ) value;
@end
協(xié)議的遵守:(MeViewController遵守TestViewControllerDelegate)
@interface MeViewController ()<TestViewControllerDelegate>
@end
關(guān)于協(xié)議有兩點(diǎn):
1.一個(gè)類可以遵守一個(gè)或多個(gè)協(xié)議,任何類只要遵守了Protocol就相當(dāng)于擁有了該P(yáng)rotocol的所有的方法聲明,其中@required 修飾下的方法必須實(shí)現(xiàn),@optional?修飾下的方法可以實(shí)現(xiàn)也可以不實(shí)現(xiàn)
2.協(xié)議與繼承之間的區(qū)別:
相同類型的類可以使用繼承,但是不同類型的類只能使用protocol
protocol可以用于存儲(chǔ)方法聲明,可以將多個(gè)類中共有的方法抽取出來(lái),以后讓這些類遵守協(xié)議即可