Protocol蚣驼,簡單來說就是一系列不屬于任何類的方法列表,其中聲明的方法可以被任何類實(shí)現(xiàn)。這種模式一般稱為代理(delegation)模式聪铺。你通過Protocol定義各種行為扼菠,在不同的場景采用不同的實(shí)現(xiàn)方式摄杂。在iOS和OS X開發(fā)中坝咐,Apple采用了大量的代理模式來實(shí)現(xiàn)MVC中View和Controller的解耦循榆。
定義Protocol很簡單,在聲明文件(h文件)中通過關(guān)鍵字@protocol定義墨坚,然后給出Protocol的名稱秧饮,方法列表,然后用@end表示Protocol結(jié)束泽篮。在@end指令結(jié)束之前定義的方法盗尸,都屬于這個(gè)Protocol。例如:
@protocol ProcessDataDelegate
@required
- (void) processSuccessful: (BOOL)success;
@optional
- (id) submitOrder: (NSNumber *) orderid;
@end
以上代碼可以單獨(dú)放在一個(gè)h文件中帽撑,也可以寫在相關(guān)類的h文件中泼各,可以視具體情況而定。該P(yáng)rotocol包含兩個(gè)方法亏拉,processSuccessful和submitOrder扣蜻。這里還有兩個(gè)關(guān)鍵字,@required和@optional及塘,表示如果要實(shí)現(xiàn)這個(gè)協(xié)議莽使,那么processSuccessful方法是必須要實(shí)現(xiàn)的,submitOrder則是可選的笙僚,這兩個(gè)注解關(guān)鍵字是在Objective-C 2.0之后加入的語法特性芳肌。如果不注明,那么方法默認(rèn)是@required的肋层,必須實(shí)現(xiàn)亿笤。
那么如何實(shí)現(xiàn)這個(gè)Protocol呢?創(chuàng)建一個(gè)普通的Objective-C類栋猖,取名為TestAppDelegate净薛,這時(shí)會(huì)生成一個(gè)h文件和m文件。在h文件中引入包含Protocol的h文件掂铐,之后聲明采用這個(gè)Protocol即可罕拂,如下:
@interface TestAppDelegate : NSObject;
@end
用尖括號(hào)(<…>)括起來的ProcessDataDelegate就是我們創(chuàng)建的Protocol。如果要采用多個(gè)Protocol全陨,可以在尖括號(hào)內(nèi)引入多個(gè)Protocol名稱爆班,并用逗號(hào)隔開即可。例如
m文件如下:
@implementation TestAppDelegate
- (void) processSuccessful: (BOOL)success{
if (success) {
NSLog(@"成功");
}else {
NSLog(@"失敗");
}
}
@end
由于submitOrder方法是可選的辱姨,所以我們可以只實(shí)現(xiàn)processSuccessful