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