OC----protocol語法

Protocol(相似java中的接口interface)
  • 簡單來講就是一系列方法的列表,其中聲明的方法能夠被任何類實現。這種模式通常稱爲代理(delegation)模式
  • 在iOS和OS X開發中,apple採用了大量的代理模式來實現MVC中View(UI控件)和Controller(控制器)的解耦
 
在java中接口中的方法是公共的,若是你實現了接口,你要實現接口中的全部方法
而OC中的Protocol與java中的接口不太相同,若是要實現Protocol中的方法,能夠獨立實現,不須要一次實現所有的Protocol內的方法
例如:
@protocol ButtonDelegate<NSObject>
-(void)onClick;
@end

@interface Button:NSObject
@property(nonatomic,retain) id<ButtonDelegate> delegate;
@end

點擊按鈕例子:

//
初始化一個按鈕 Button*btn=[[Button alloc]init]; //初始化一個按鈕的監聽器 ButtonListener *listener=[[ButtonListener alloc]init]; //設置按鈕的監聽器 btn.delegate=listener; //點擊按鈕 [btn onClick];

 

 
 
在Button.m文件中實現click方法:
-(void)onClick{
   [ _delegate onClick]
}

 

 
 
在使用@protocol的時候能夠用跟@class相同的用法,在聲明的時候不用import.h文件,只是在實現的時候import就能夠了,
 
一樣,咱們能夠重寫click方法去實如今監聽器裏打印出是哪一個按鈕被點擊了
-(void)click{
   //按鈕被點擊,通知監聽器,並告訴監聽器,是哪一個按鈕被點擊了
   if ([_delegate respondsToSelector:@selector(onClick:)]){
       [_delegate onClick:self];
      }else{
          NSLog(@"監聽器並無實現onClick:方法」)
}

 

 
一樣的,咱們能夠在一個類裏邊同時實現兩個或者多個protocol
例如:
@protocol Study,Learn;
@interface Student:NSObject <Study,Learn>
 
若是在@protocol中使用了@required關鍵字,那麼就表示@required下邊的方法都必須實現
例如:
@required
-(void)test;
-(void)test1;
-(void)test2;
對於@required,雖然字面上說是必須實現,可是編譯器並不強求某個類必須進行實現
 
若是在@protocol中使用了@optional關鍵字,那麼就表示@optional下邊的方法是選擇實現的
例如:
@optional
-(void)test4;
 
查看某個類的對象有沒有遵照某個協議,用conformsToProtocol關鍵字
例如:
if([stu conformsToProtocol:@protocol(study)]){
}
 
查看某個類的對象有沒有實現某個方法,用respondsToSelector關鍵字
例如:
if([_delegate respondsToSelector:@selector(onClick:)]){
}
相關文章
相關標籤/搜索