1.Protocol協(xié)議
Protocol,簡(jiǎn)單來(lái)說(shuō)就是一系列不屬于任何類(lèi)的方法列表,其中聲明的方法可以被任何類(lèi)實(shí)現(xiàn)。這種模式一般稱(chēng)為代理(delegation)模式。你通過(guò)Protocol定義各種行為,在不同的場(chǎng)景采用不同的實(shí)現(xiàn)方式。在iOS和OS X開(kāi)發(fā)中,Apple采用了大量的代理模式來(lái)實(shí)現(xiàn)MVC中View和Controller的解耦。
定義Protocol很簡(jiǎn)單,在聲明文件(h文件)中通過(guò)關(guān)鍵字@protocol定義,然后給出Protocol的名稱(chēng),方法列表,然后用@end表示Protocol結(jié)束。在@end指令結(jié)束之前定義的方法,都屬于這個(gè)Protocol。
@protocol protocolName
@required
- (void)requiredMethod;
@optional
- (void)optionalMethod
@end
如果不明確標(biāo)明required還是optional,則默認(rèn)為required,遵循給協(xié)議的類(lèi)必須實(shí)現(xiàn)該方法。
協(xié)議支持繼承
@protocol protocolname1
@end
@protocol protocolname2 <protocolname1>
@end;
則類(lèi)實(shí)現(xiàn)protocolname2協(xié)議時(shí)必須實(shí)現(xiàn)protocolname1協(xié)議,一般我們要繼承NSobject協(xié)議,不過(guò)因?yàn)槲覀兊念?lèi)基本是繼承NSObject類(lèi),而NSObject類(lèi)實(shí)現(xiàn)了NSobject,所以寫(xiě)不寫(xiě)都行,不過(guò)明確寫(xiě)出是推薦的。
某個(gè)類(lèi)實(shí)現(xiàn)協(xié)議用<>標(biāo)明,多個(gè)協(xié)議用,隔開(kāi)。
@interface Objectname : NSObject <protocolname1>
@end
2.delegate委托
delegate是回調(diào)機(jī)制的一種,delegate是委托模式。委托模式就是將一件屬于委托者做的事情交給被委托者來(lái)處理。舉個(gè)例子,我們點(diǎn)擊一個(gè)Table某行,Table認(rèn)為自己負(fù)責(zé)顯示,就將點(diǎn)擊這個(gè)事情交給UITableViewController來(lái)處理,UITableViewController在我們點(diǎn)擊的時(shí)候就利用
TableView: - didSelectRowAtIndexPath:
方法,在我們點(diǎn)擊表格后有了相應(yīng)的反饋,如跳入下一頁(yè)等。
這就是Table委托了UITableViewController來(lái)處理點(diǎn)擊事件,Table稱(chēng)之為委托對(duì)象,UITableViewController稱(chēng)之為被委托對(duì)象。那么如何確定委托對(duì)象能否實(shí)現(xiàn)所需要的功能呢,通過(guò)協(xié)議,被委托者需要準(zhǔn)守約定的協(xié)議來(lái)實(shí)現(xiàn)所需的功能。
使用delegate的步驟
創(chuàng)建一個(gè)委托協(xié)議;
對(duì)于委托者A:
1.委托者聲明要委托的屬性,該屬性遵守協(xié)議;
2.委托者在自己實(shí)現(xiàn)的方法,通過(guò)遵守協(xié)議的屬性,調(diào)用協(xié)議內(nèi)的方法;
對(duì)于委托對(duì)象B:
委托對(duì)象實(shí)現(xiàn)委托協(xié)議所定義的方法。
舉例如下,有個(gè)人開(kāi)公交想要賺錢(qián),但是需要找個(gè)售票的幫他收錢(qián)。
- 創(chuàng)建一個(gè)Bus協(xié)議,描述需求是需要會(huì)賣(mài)票。對(duì)應(yīng)第一步
- 在公交車(chē)類(lèi)里聲明一個(gè)賣(mài)票者屬性,這個(gè)屬性應(yīng)由外界賦值。A.1
- 公交車(chē)上路后(startRun),代碼內(nèi)部的sellTicket由準(zhǔn)守該協(xié)議的onePerson執(zhí)行。對(duì)應(yīng)A.2
//公交車(chē)的使用協(xié)議
@protocol CompanyProtocol <NSObject>
-(void)sellTicket;
@end
//公交車(chē)類(lèi)的聲明
@interface Bus : NSObject
@property(nonatomic,strong)id<busProtocol>onePerson;
-(void)startRun;
@end
//公交車(chē)類(lèi)的實(shí)現(xiàn)
@implementation Bus
-(void)startRun
{
if(self.onePerson)
{
[self.onePerson sellTicket];
[self.onePerson reportSituation];
}
}
@end
我們需要的賣(mài)票對(duì)象如下,它遵守協(xié)議實(shí)現(xiàn)了賣(mài)票的方法。對(duì)應(yīng)B
@interface Seller : NSObject <busProtocol>
@end
@implementation Seller
-(void)sellTicket
{
NSLog(@"開(kāi)始售票!");
}
-(void)reportSituation
{
NSLog(@"完成售票!");
}
@end
在main中開(kāi)車(chē)的bus類(lèi)startRun中調(diào)用了sellTicket
main()
{
Seller * sell = [[Seller alloc] init];
Bus * bus = [[Bus alloc] init];
Bus.onePerson = sell;
[bus startRun];//當(dāng)大巴車(chē)開(kāi)始運(yùn)行,本質(zhì)上是調(diào)用Seller對(duì)象sell的sellTicket方法。
}
main中雖然是bus 在進(jìn)行sellTicket,但是實(shí)質(zhì)上是由bus對(duì)象委托了sell對(duì)象進(jìn)行賣(mài)票。這就是一個(gè)委托模式的示例代碼了。