delegate與protocol

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)。

  1. 創(chuàng)建一個(gè)Bus協(xié)議,描述需求是需要會(huì)賣(mài)票。對(duì)應(yīng)第一步
  2. 在公交車(chē)類(lèi)里聲明一個(gè)賣(mài)票者屬性,這個(gè)屬性應(yīng)由外界賦值。A.1
  3. 公交車(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è)委托模式的示例代碼了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 禪與 Objective-C 編程藝術(shù) (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,778評(píng)論 1 10
  • 1.OC里用到集合類(lèi)是什么? 基本類(lèi)型為:NSArray,NSSet以及NSDictionary 可變類(lèi)型為:NS...
    輕皺眉頭淺憂思閱讀 1,478評(píng)論 0 3
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new,alloc或copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1...
    如風(fēng)家的秘密閱讀 955評(píng)論 0 4
  • 疾病起源 疾病到底是什么?一切疾病都起源于精神層面。疾病一般起始于情緒,它在物質(zhì)身體里表現(xiàn)為有某些淤塞物。通常是心...
    思敏姐姐閱讀 1,254評(píng)論 0 3
  • 魚(yú)頭 夜里12點(diǎn)接到哥們電話,叫我過(guò)去一趟。 “現(xiàn)在?” “現(xiàn)在!” 哥們與我同村,初中畢業(yè)一起出來(lái)闖...
    老齁閱讀 304評(píng)論 0 0

友情鏈接更多精彩內(nèi)容