iOS中的Protocol

最近工作中遇到一個比較迷惑的事情,在我利用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)容界牡,比較簡單。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漾抬,一起剝皮案震驚了整個濱河市宿亡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纳令,老刑警劉巖挽荠,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件克胳,死亡現(xiàn)場離奇詭異,居然都是意外死亡圈匆,警方通過查閱死者的電腦和手機(jī)漠另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跃赚,“玉大人笆搓,你說我怎么就攤上這事∥嘲粒” “怎么了满败?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叹括。 經(jīng)常有香客問我算墨,道長,這世上最難降的妖魔是什么领猾? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任米同,我火速辦了婚禮骇扇,結(jié)果婚禮上摔竿,老公的妹妹穿的比我還像新娘。我一直安慰自己少孝,他們只是感情好继低,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稍走,像睡著了一般袁翁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婿脸,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天粱胜,我揣著相機(jī)與錄音,去河邊找鬼狐树。 笑死焙压,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抑钟。 我是一名探鬼主播涯曲,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼在塔!你這毒婦竟也來了幻件?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蛔溃,失蹤者是張志新(化名)和其女友劉穎绰沥,沒想到半個月后篱蝇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡徽曲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年态兴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疟位。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞻润,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甜刻,到底是詐尸還是另有隱情绍撞,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布得院,位于F島的核電站傻铣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祥绞。R本人自食惡果不足惜非洲,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜕径。 院中可真熱鬧两踏,春花似錦、人聲如沸兜喻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朴皆。三九已至帕识,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遂铡,已是汗流浹背肮疗。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留扒接,地道東北人伪货。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像珠增,于是被迫代替她去往敵國和親超歌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 最近工作中遇到一個比較迷惑的事情蒂教,在我利用runtime獲取類的屬性的時候巍举,由于類實現(xiàn)了一個自定義協(xié)議,導(dǎo)致遍歷出...
    樹根曰閱讀 849評論 2 3
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用凝垛,...
    LZM輪回閱讀 3,291評論 0 6
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法懊悯,類相關(guān)的語法蜓谋,內(nèi)部類的語法,繼承相關(guān)的語法炭分,異常的語法桃焕,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評論 25 707
  • 昨天試著把系統(tǒng)移植到PHP 7.1上執(zhí)行看看,系統(tǒng)裝完瀏覽器一開能看到登入畫面捧毛,正高興著观堂,結(jié)果就發(fā)現(xiàn)登入不進(jìn)去,看...
    哎呦_Jason閱讀 5,089評論 0 0