iOS 的一點理解(一) 代理delegate


   做了一年的iOS,想記錄自己對知識點的一點理解。

  第一篇,想記錄一下iOS中delegate(委托,也有人稱作代理)的理解吧。

  故名思議,delegate就是代理的含義, 一件事情自己不方便做,然后交給其他人去幫助實現, 比如A、B兩個類,A的一個對象有一個任務aTask要在B類中實現,任務無法在A類本身中實現,所以要交給B類幫忙,則A和B約定一個協議:

 

A類:

 

1   @protocol ADelegate <NSObject>  
2    -(void)aTask;   //協議的一個方法 3 4   @end 5 6   //代理屬性,同時約定作為代理的對象必須實現ADelegate協議 7 8   @property (nonatomic,assign) id <ADelegate> aDelegate; //屬性用assign不用retain是為了避免循環引用

 

B類:

  B類中,B類繼承A的代理,表示同意該協議,以后我們就按說好的辦事了:

 1   //繼承A的代理協議

2 @interface B () <ADelegate>

3 @end  

 

  B用一個事件,比如按鈕點擊,在點擊方法onBButtonClicked里觸發任務

 

 1   //按鈕點擊
 2   -(void)onBButtonClicked{
 3 
 4 
 5       //在B類中,初始化一個A類的對象aObj = [[A alloc] init];
 6       AViewController *aObj = [[AViewController alloc] init];
 7 
 8    //指定A類的代理,這事就交給aObj你去做了。
 9       aObj.aDelegate  = self;
10     
11       //判斷_aDelegate實例是否實現了aTask方法
12 
13     //避免未實現aDelegate的類也作為A的監聽
14       if([A.aDelegate respondsToSelector:@selector(aTask)]){
15           //_viewDelegate對象調用代理方法觸發任務
16           [A.aDelegate aTask];
17         
18           NSLog(@"excute A`s aTask");
19       }
20 
21 
22   }
23 
24 
25   //在代理方法里實現A所交代的任務
26   -(void)aTask{
27 
28    //具體任務內容
29       NSLog(@"aTask is execute.");
30   }

 

小demo: DelegateDemo.zip

 

補充: 1.在協議@Protocol里,有些方法不一定都需要實現,可以根據需求添加一些關鍵字來標記方法的重要性,比如

    @required //必須實現的方法     @optional //可選實現的方法
     2.協議可以擴展自另一個協議,aDelegate就擴展自NSObject;
   3.協議中不能定義屬性、成員變量等,只能定義方法;
   4. (2016-01-30補充)代理也經常用在頁面跳轉時候的傳遞value中,在點擊按鈕跳轉的時候,用代理傳值。
 如果存再多個代理,可以使用respondsToSelector方法判斷哪個代理是否相應該代理方法。
if ([_delegate respondsToSelector:@selector(sendValue:)]){} 

引論:
   事實上在ObjC中協議的更多作用是用於約束一個類必須實現某些方法,而從面向對象的角度而言這個類跟接口並不一定存在某種自然關系,
可能是兩個完全不同 意義上的事物,這種模式我們稱之為代理模式(Delegation)。在Cocoa框架中大量采用這種模式實現數據和UI的分離,
而且基本上所有的協議都 是以Delegate結尾。


參考鏈接:
     1. http://blog.csdn.net/jianxin160/article/details/47753189

     2. http://www.apkbus.com/forum.php?mod=viewthread&tid=137785

      3.  http://www.cocoachina.com/ios/20150112/10880.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM