【IOS開發之Objective-C】協議和代理

來源:互聯網
上載者:User

標籤:objective-c   協議   代理   代理的回調   

在現實生活中我們存在各種各樣的協議,但是都有一個共同點,就是擬定的協議,就要遵守,不遵守就是違約。在OC中也有協議這一個概念而且和我們現實生活中的協議的特點是類似的。有時我們自己想做什麼事,但是現在沒這個能力自己去做,親力親為,我們就需要找代理來幫我們做了。那麼在OC中也有代理這個概念。下面就簡單的說說OC中的協議和代理。

一、協議

在《【IOS開發之Objective-C】對象的互動》中實現了一種對象的互動的方式。在OC中還有其他方式,比如說協議,在OC中用協議來規範介面,是實現對象之間的互動的一種機制。類似於JAVA中的介面。還可以類比多繼承。

協議的實現第一步:使用Xcode建立一個工程;

怎麼建立一個工程《【IOS開發之Objective-C】建立第一個工程-HelloWorld》。

第二步:建立一個OC檔案;

在這個工程裡面 New File-----> Objective-C File -----> 填寫檔案名稱 – > 在File Type 裡面選擇“Protocol” 最後點擊Next。

第三步:“擬定”協議;

假設我和某人簽訂和一個協議,協議裡面需要我執行一個動作:每天練習一小時OC編程;那麼這條協議內容就是:       - (void)aDayCodeOneHour;這隻是一個協議條款,協議自己本身事沒有能力遵守協議或是實現協議。

#import <Foundation/Foundation.h> @protocol MyProtocol <NSObject> - (void)aDayCodeOneHour; @required  //預設屬性,必須要實現- (void)show; //show 是必須要實現 @property (nonatomic,assign) int a;@optional      // 可選實現- (void)show1; //show1 是可實現也可不實現@end

第四步:遵守協議;

建立一個Person的類,在這個類.m檔案裡面來實現這個方法。在實現之前需要先表明你為什麼實現這個方法。那麼我們就需要在Person這個類裡面表明我是遵守這個協議。我們就需要在類的.h檔案裡面表明我是遵守這個協議的。

#import <Foundation/Foundation.h>#import "MyProtocol.h"@interface Person : NSObject <MyProtocol>@property (nonatomic,assign) int a;@end

這裡我們要做兩件事,第一是包好協議這個標頭檔,第二就是@interface Person : NSObject <MyProtocol>。接下來就是協議的實現了。在Person.m這個檔案中我們簡單的實現一下:

#import "Person.h"@implementation Person- (void)aDayCodeOneHour{       NSLog(@"我的協議內容是“每天練習一小時OC編程”");}- (void)show{       NSLog(@"這是一個協議的例子。");}@end

第五步:主函數中示範

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {       @autoreleasepool {     Person * ps = [[Person alloc] init];        [ps aDayCodeOneHour]; //預設的也是必須要實現的        [ps show]; //調用@required 修飾的一個方法        ps.a = 10; //給a賦值        NSLog(@"%d",ps.a); //取a的值列印出來         id<MyProtocol>obj = ps; //使用di的方法表明obj就是一個對象ps        [obj show];//obj 也調用show 這個方法       }    return 0;}

我們在協議MyProtocol 裡面還有幾句是沒有說明的:

@required  //預設屬性,必須要實現

- (void)show; //show 是必須要實現

@property (nonatomic,assign)int a;

@optional      // 可選實現

- (void)show1; //show1 是可實現也可不實現  l例子中沒實現

@required 預設屬性,被他修飾的方法是必須要實現的;

@optional 可選屬性,被他修飾的方法可以不實現

 

在協議中我們不能聲明變數,但是我們可以使用屬性的方法:

@property (nonatomic,assign)int a;

在協議遵守方中要實現這個,也是在.h檔案中粘貼一些這條語句,系統自動會給我們生產set和get方法。

主函數就比較簡單了,但是需要學習這一句:

     id<MyProtocol>obj = ps;//使用id的方法表明obj就是一個對象ps的副本

        [obj show];//obj也調用show這個方法

id的這一句,這裡使用一個id類遵守MyProtocol協議的對象obj,讓這個對象和對象ps指向的是同一塊記憶體地區。

怎麼類比多繼承呢?

其實也不難,我們可以這麼實現<協議1,協議2 > 。其實在系統庫裡面也有很多這樣的寫法。這裡我就不寫了。

 

二、代理模式什麼是代理?

代理模式是實現兩個對象之間的互動的一種機制。在代理模式中涉及到兩個對象,一個是主動方一個是被動方。

主動方:擬定協議,建立一個攜帶協議的 id 指標(指向某個具體的代理);

被動方:遵守協議,實現協議的方法。

生活情境

現在什麼送外賣的很是多,每天路上都有很多發單的。我們不想取買飯,就可以叫外賣。我們可以指定哪一家吃什嗎?我們也不能說拿了外賣就不給錢吧,我們還需要給商家付款。這裡涉及到四個問題。我買哪一家的飯?我買什麼飯?我要給賣家付款。賣家需要得到他的飯款。情境拆解後就是這麼幾個步驟了。

①.買家的需求:我要吃飯,吃哪家的什麼飯呢?

②.買家選店鋪和吃什麼;

③.賣家給買家送飯;

④.買家給賣家付款;  

⑤.賣家得到他的飯款。

代理的實現

有了這些步驟下面實現起來就不難了。

#import <Foundation/Foundation.h>//在主動方擬定協議@protocol BuyFood <NSObject>- (void)sendFood;//賣家送餐- (void)getMoney:(int)money;//賣家得到飯錢@end@interface Person : NSObject- (void)wantToEat:(NSString *)food;//買家想吃飯  什麼飯- (void)give:(int)money;//賣家給賣家多少錢//聲明一個帶有協議指標的屬性@property (nonatomic,assign) id<BuyFood>delegate;@end

#import "Person.h"@implementation Person- (void)wantToEat:(NSString *)food{  //選好吃什麼       NSLog(@"顧客:我想吃 %@",food);       [self.delegate sendFood];}- (void)give:(int)money{ //買家付款       //注意這裡的 self.delegate       [self.delegate getMoney:money]; //付款給給我送餐的賣家 }@end

#import <Foundation/Foundation.h>#import "Person.h"@interface Rooom : NSObject <BuyFood>- (void)show;- (void)wantToGetMyMoney;@end
 
#import "Rooom.h"@implementation Rooom{       int  _money;}- (void)sendFood{ //賣家送餐       NSLog(@"店家:好的我馬上給您派送");}- (void)getMoney:(int)money{       _money = money; //賣家得到飯錢就放進他自己的口袋了}- (void)wantToGetMyMoney{ //賣家想得到飯錢就需要買家付款  買家付款給對應的賣家 //這裡就是代理的回調       Person * p1 = [[Person alloc] init];       p1.delegate = self;   //注意這裡的self  誰調用這個方法self就是誰       [p1 give:15];       //give是主動方的方法  買家付款15元}- (void)show{       NSLog(@"店家:我得到了我的money:%d",_money);}@end #import <Foundation/Foundation.h>#import "Person.h"#import "Rooom.h"int main(int argc, const char * argv[]) {       @autoreleasepool {        Person * per = [[Person alloc] init];        Rooom * roo = [[Rooom alloc] init];               [per wantToEat:@"魚香肉絲飯"];  //我想吃魚香肉絲飯             per.delegate = roo;              //指定代理  設定代理  選店鋪        [roo sendFood];                 //賣家送餐        [roo wantToGetMyMoney];        //買家付款 賣家得到飯錢        [roo show];                      //高興的賣家 說我得到了多少錢       }return 0;

輸出:

2015-08-03 21:41:15.656 3.代理模式[3528:303] 顧客:我想吃 魚香肉絲飯2015-08-03 21:41:15.673 3.代理模式[3528:303] 店家:好的我馬上給您派送2015-08-03 21:41:15.674 3.代理模式[3528:303] 店家:我得到了我的money:15

Program ended with exitcode: 0

以上就這這個情景模式的全部代碼。裡面有協議,有代理也有代理的回調。每一步是做什麼的上面有分析,代碼中也有注釋。

我們再來分析:

①.買家的需求:我要吃飯,吃哪家的什麼飯呢?

②.買家選店鋪和吃什麼       // 買家選店鋪指定代理

③.賣家給買家送飯;         // 選定店鋪後賣家需要做的  協議

④.買家給賣家付款;         // 給代理傳值正向傳值   買家給賣家付款

⑤.賣家得到他的飯款。       // 代理的回調賣家需要從買家那裡得到飯錢

代理的回調

代理的回調:調用某個功能模組,這個功能模組返回一些資料,但是功能不知道具體返回給哪個對象,這個時候,我們可以通過協議規範接收者接收資料方法,這個過程就是回調。

代理的回調也在上面的情境裡面可,代碼上面也有。

三、總結

通過上面的具體執行個體,我們要知道什麼是協議?什麼是代理?協議和代理之間的聯絡。怎麼去實現一個簡單的協議,或是說協議的基本格式是什嗎?代理的基本格式是什嗎?代理怎麼回調?

當然上面這些舉例和代碼是不足以使我加深對協議和代理的理解的,還需要我在工作和學習中多總結,理論聯絡實際。

 

 

 

 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

【IOS開發之Objective-C】協議和代理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.