最近工作中遇到一個比較迷惑的事情,在我利用runtime獲取類的屬性的時候方椎,由于類實現(xiàn)了一個自定義協(xié)議,導(dǎo)致遍歷出來的屬性中包含了NSObject協(xié)議中的property冯凹。查來查去吉嚣,只是知道和protocol有關(guān)梢薪。晚上問了下朋友(iOS大神),結(jié)果被他一句點破尝哆。發(fā)現(xiàn)這部分知識點遺漏了一點秉撇。
protocol類似java中的interface,主要是用來定義一套對象之間的通信規(guī)則较解。protocol也是我們設(shè)計時常用的一個東西畜疾,相對于直接繼承的方式赴邻,protocol則偏向于組合模式印衔。因為在設(shè)計對象的時候,如果基類東西很多姥敛,而不同的子類又不一定都需要基類的東西奸焙,或者在絕大部分需要的同時,又有特殊的要求彤敛,那這個時候就很混亂了与帆。采用接口,可以將不同的功能歸類為不同的接口墨榄,這樣玄糟,子類需要什么功能,自己去實現(xiàn)這個接口袄秩,這樣在保持繼承性的同時阵翎,可以對功能進(jìn)行擴(kuò)展,而不影響其他類之剧,也讓子類保持自己的特有性郭卫。
protocol語法:
@protocol protocolName
//method
//property
@end```
和類的聲明很相似,不僅可以什么方法,同樣也可以聲明```property```背稼。如果某個類需要實現(xiàn)某個接口贰军,則只需要在類的申明后面加上<>,在里面寫上要實現(xiàn)的協(xié)議名字,多個協(xié)議以逗號隔開蟹肘。
```objc
@interface Test : NSObject <delegate1, delegate2>
@end
protocol關(guān)鍵字:required词疼,optional
@protocol TestProtocol
@required
- (void)requiredMethod;
@optional
- (void)optionalMethod帘腹;
@end```
protocol默認(rèn)都是required的寒跳,一個類在實現(xiàn)協(xié)議的時候是必須要實現(xiàn)這些方法的。相對的竹椒,如果optional下面的方法童太,則表示類可以選擇性的實現(xiàn)。判斷這個類是否實現(xiàn)某個方法則只需調(diào)用```[self.delegate respondToSelector:@selector()]```
#protocol的繼承
protocol和類一樣,同樣可以進(jìn)行繼承书释,這個也是我遺漏的一點翘贮。
```objc
@protocol Test1Delegate
@end
@protocol Test2Delegate <Test1Delegate>
@end;```
這個時候,如果類實現(xiàn)了Test2Delegate這個協(xié)議爆惧,那么也必須實現(xiàn)Test1Delegate里面的方法狸页。 我們自己寫的protocol的時候,一般Xcode都默認(rèn)幫我們繼承了NSObject這個協(xié)議扯再。如果你不繼承的話也沒啥大的影響芍耘,因為我們的對象都是繼承自NSObject,而NSObject也實現(xiàn)了```NSObject```這個協(xié)議熄阻。所以斋竞,當(dāng)我們需要調(diào)用NSObject協(xié)議里面的方法的時候,也不會出錯秃殉。不過蘋果還是推薦繼承NSObject這個協(xié)議坝初。
#protocol隱藏類的類型
在我們iOS開發(fā)中也會出現(xiàn)這種形式,比如iOS7的導(dǎo)航欄動畫钾军,蘋果只是需要你返回一個實現(xiàn)了```UIViewControllerAnimatedTransitioning```這個協(xié)議的對象就行了鳄袍。
還有一個可能在和第三方sdk打交道的時候見得比較多。在別人實現(xiàn)的框架里面吏恭,有的時候拗小,不希望把類的類型和里面方法暴露給你,而你也不太可能直接創(chuàng)建這個對象樱哼。這個時候就可以采用protocol這個方式哀九,讓調(diào)用者無需知道類的類型,一樣可以完成自己想要的操作唇礁。
```objc
id <Test1Delegate>obj = [XXXX createObj];
調(diào)用者只需要通過[XXXX createObj]
這個方法勾栗,獲取一個實現(xiàn)Test1Delegate而不知道類型的實例。在需要的地方盏筐,這個obj可以直接調(diào)用協(xié)議里面的方法围俘,因為,這個對象都已經(jīng)實現(xiàn)了琢融。
protocol 差不多就這么多內(nèi)容界牡,比較簡單。