Objective-C Protocol&Delegate(協(xié)議和代理)

定義

協(xié)議是多個類共享的一個方法列表脱货。協(xié)議中列出的方法沒有對應(yīng)的實現(xiàn),計劃由他人來實現(xiàn)律姨。協(xié)議提供了一種方式振峻,用指定的名稱定義一組相關(guān)的方法。這些方法通常由文檔說明择份,所以實現(xiàn)者知道知道它們將如何執(zhí)行扣孟。

定義一個協(xié)議的方法很簡單,只需要使用@protocol指令荣赶,后面跟上你給處的協(xié)議名稱凤价。然后鸽斟,和處理@interface一樣,聲明一些方法利诺。@end指令之前的所有方法聲明都是協(xié)議的一部分富蓄。

如果選擇使用Foundation框架,你將會發(fā)現(xiàn)一些已定義的協(xié)議慢逾。其中一個名為NSCopying,而且它聲明了一個方法侣滩。下面是標(biāo)準Foundation頭文件NSOBject.h中定義NScopying協(xié)議的方式:NSObject.h:

@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end

使用

如果你的類使用NSCopying協(xié)議,則必須實現(xiàn)copyWithZone:方法寝志。通過在@interface行加一對尖括號(<……>)內(nèi)列出協(xié)議名稱,可以告知編譯器你正在采用一個協(xié)議策添,如:

@interface AddressBook : NSObject <NSCopying>

其含義為材部,AddressBook是父類為NSObject的對象,并且它遵守NSCopying協(xié)議败富。因為系統(tǒng)已經(jīng)知道以前為這個協(xié)議定義的方法(從頭文件NSObject.h中獲知)悔醋,所以并不必在接口部分聲明這些方法。但是要在實現(xiàn)部分定義它們芬骄。編譯器期望在AddressBook的實現(xiàn)部分找到定義的copyWithZone:方法猾愿。

如果你定義了自己的協(xié)議,不必由自己去實現(xiàn)它账阻。但是蒂秘,這就告訴其他程序員淘太,如果要采用這項協(xié)議,則必須實現(xiàn)這些方法蒲牧。這些方法可以從父類繼承。這樣冰抢,如果一個類遵守NSCopying協(xié)議,那么它的子類也遵守NSCopying協(xié)議(不過者并不意味著對該子類而言翠订,這些方法得到了正確的實現(xiàn))巢音。

注意事項

  • 協(xié)議不引用任何類尽超!它是無類的(classless)。任何類都可以都可以遵守某個協(xié)議 似谁;
  • 分類也可以采用一項協(xié)議;
  • 協(xié)議也可以采用一項協(xié)議斜筐;
  • 和類名稱一樣蛀缝,協(xié)議名必須是唯一的顷链。

代理 Delegate

協(xié)議也是一種兩個類之間的接口定義屈梁。定義了協(xié)議的類可以看做是將協(xié)議定義的方法代理給了實現(xiàn)它們的類。這樣煞抬,類可以更為通用构哺,因為具體的動作由代理來承擔(dān)革答,來響應(yīng)某些事件或者定義某些參數(shù)曙强。Cocoa和iOS非常依賴這個概念。例如碟嘴,當(dāng)你在iPhone上建立一個表格時,會使用UITableView類娜扇。但是這個類不清楚表格的標(biāo)題是什么,需要包含多少個區(qū)塊有多少行枢析,填充單元格的內(nèi)容是什么致燥。所以登疗,代理定義了一個UITableViewDataSource協(xié)議。如果它需要信息辐益,比如表格中的每個區(qū)塊有多少行,它就會調(diào)用類中實現(xiàn)協(xié)議的相關(guān)方法智政。UITableView類還定義了協(xié)議UITableViewDelegate。協(xié)議中還定義了一些方法垦垂,如表格中某些行選中需要怎么樣。UITableView類并不知道還要做哪些事情劫拗,所以將這個代理給其他類矾克。


歡迎來我的個站逛逛: http://alexyu.me/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酒繁,隨后出現(xiàn)的幾起案子控妻,更是在濱河造成了極大的恐慌州袒,老刑警劉巖弓候,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彰居,居然都是意外死亡撰筷,警方通過查閱死者的電腦和手機畦徘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來井辆,“玉大人,你說我怎么就攤上這事蒸播。” “怎么了袍榆?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宿崭。 經(jīng)常有香客問我才写,道長,這世上最難降的妖魔是什么赞草? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蜕劝,結(jié)果婚禮上轰异,老公的妹妹穿的比我還像新娘岖沛。我一直安慰自己搭独,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布唉俗。 她就那樣靜靜地躺著配椭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪股缸。 梳的紋絲不亂的頭發(fā)上瘾境,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天镰惦,我揣著相機與錄音,去河邊找鬼旺入。 笑死凯力,一個胖子當(dāng)著我的面吹牛礼华,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卓嫂,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晨雳,長吁一口氣:“原來是場噩夢啊……” “哼行瑞!你這毒婦竟也來了餐禁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氧吐,失蹤者是張志新(化名)和其女友劉穎末盔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陨舱,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年误墓,在試婚紗的時候發(fā)現(xiàn)自己被綠了益缎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡欣范,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熙卡,到底是詐尸還是另有隱情励饵,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布役听,位于F島的核電站,受9級特大地震影響甜滨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衣摩,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一捂敌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧占婉,春花似錦、人聲如沸逆济。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽简僧。三九已至,卻和暖如春涎劈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛛枚。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扭吁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓侥袜,卻偏偏與公主長得像溉贿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宇色,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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