iOS中的協議與委託

來源:互聯網
上載者:User

        協議就相當於是C++中的純虛基類,它只能定義函數並且只能由其他類來實現。而委託則類似於Java介面,其實協議和委託之間並無必然聯絡,只是在Obj—C中常用協議來實現委託。

        protocol-協議,就是使用了這個協議後就要按照這個協議來辦事,協議要求實現的方法就一定要實現。

        delegate-委託,顧名思義就是委託別人辦事,就是當一件事情發生後,自己不處理,讓別人來處理。

        注意以下幾點:

1.協議聲明了可以被任何類實現的方法; 
2.協議不是類,它是定義了一個其他對象可以實現的介面 ;
3.如果在某個類中實現了協議中的某個方法,也就是這個類實現了那個協議。 
4.協議經常用來實現委派物件。

5.在協議的聲明中的特性關鍵字:

      @optional先行編譯指令:表示可以選擇實現的方法 

      @required先行編譯指令:表示必須強制實現的方法 

     

     下面舉個例子來說明:當一個A view 裡麵包含了B view,而b view需要修改a view的介面,那麼這個時候就需要用到委託了。

步驟如下:

1、首先定一個協議

2、a view實現協議中的方法

3、b view設定一個委託變數

4、把b view的委託變數設定成aview,意思就是,b view委託a view辦事情。

5、事件發生後,用委託變數調用a view中的協議方法

具體實現時,代碼可以類似於:

B_View.h:@protocol  B_ViewDelegate<NSObject>@optional -(void)touch:(id)sender;@end@interface  B_View:UIViewController{}@property(nonatomic,retain) id<B_ViewDelegate> touchDelegate;//以一個別名來聲明委託@endB_View.m:  @synthesize touchDelegate;  - (id)initWithFrame:(CGRect)frame {  if (self = [super initWithFrame:frame]) {   [touchDelegate  touch];//調用協議委託,委託給A_View來實現函數}  return self;  }  @endA_View.h:@interface:UIViewController<B_ViewDelegate>{B_View *myB_View;}@endA_View.m:- (void)viewWillAppear:(BOOL)animated  {  myB_View.touchDelegate = self; //設定委託 ,這裡可以看出委託其實也可以理解為B_View中的一個屬性 [self.view addSubview: myB_View];  }  - (void)ontouch:(id)sender{     //實現協議方法
}

        就像上面說的,其實協議和委託並無必然的聯絡,只是在Obj—C中我們時常用協議來實現委託,但是我們不用協議也可以實現委託。例如:

       定義一個類A:

@interface A:NSObject-(void)print;@end@implement A-(void)print{NSLog(“ok,print”);}

     定義一個類B,在B中聲明A的執行個體為B的成員變數:

@interface B:NSObject{   A *a_delegate;}@end

     然後在main()函數中實現委託機制:

void main{B *b=[[B alloc] init];  A *a=[[A alloc] init];  b.a_delegate=a; //設定b中的成員變數為a,這樣就可以調用a中print方法。 [b.a_delegate print];  }

      還有一種方式,這種方式接近於我們所用的協議實現委託機制,但它還並沒有用到協議:

首先,定義一個類B,B委託類A來實現print:

@interface B:NSObject{  id delegate;}  @end @implement B  -(void)callPrint{  [self.delegate print];  }  @end  

然後,在類A中實現print:

@interface A:NSObject{  B *b;  }  -(void)print;  @end  @implement A  -(void)viewDidLoad{  b=[[B alloc]init];  b.delegate=self;  //設定B的代理為self(即A)}  -(void)print{  NSLog(@"print was called");  }  //在A中實現print@end

還有一點值得提一下:

       資料來源幾乎等同於委託,不同之處在於它同發布委託的對象之間關係。發布委託的對象並不把對於使用者介面的控制轉交給它,而是把資料控制交給它。發布委託的對象,通常是諸如表視圖這樣的視圖對象。它持有資料來源引用,並時不時向其索要待顯示資料。資料來源和委託一樣,也必須遵循某種協議並至少實現協議所要求的方法。資料來源負責管理模型對象的記憶體,並將其提供給發布委託的視圖。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.