做了一年的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