定義
協(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/