1.什麼是protocol?objective-c
protocol(協議)是用來定義對象的屬性和行爲,用於回調。ui
2.protocol分類?
spa
協議中有三個修飾關鍵字@required和@optional和@property。code
3.三個修飾關鍵字的做用
對象
被@required修飾的方法爲必須實現的方法;it
被@optional修飾的方法爲可選實現的方法;io
@property用於修飾屬性。
編譯
1、定義一個protocolclass
新建文件的時候不要選擇objective-c Class;而要選擇objective-c protocol。
import
#import <Foundation/Foundation.h> @protocol ClassADelegate <NSObject> @required//必須實現 - (void)methodA; @optional//可選實現 - (void)methodB; @property NSString *_str; @end
2、定義protocol的實現(只是定義,對外宣稱本身實現了)
A.建立一個objective-c Class,在頭文件中實現 ClassADelegate。
#import <Foundation/Foundation.h> #import "ClassADelegate.h" @interface ClassA : NSObject <ClassADelegate> @end
3.調用protocol中的方法(相似Java中調用interface中的方法)
#import "ViewController.h" #import "ClassA.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; ClassA *a = [[ClassA alloc] init]; [a methodA]; [a methodB]; }4.運行程序,發現報錯
ProtocolAndDelegate[373:60b] -[ClassA methodA]: unrecognized selector sent to instance 0x17001dff0緣由分析:在第二步裏面,只是定義了實現,爲真正實現。
在ClassA.m文件的頂部會有警告提示:
Method 'methodA' in protocol not implemented
methodB被@optional修飾,是可選實現,全部沒有警告提示;可是運行的時候依然會報錯。
5.真正實現協議中的方法
#import "ClassA.h" @implementation ClassA - (void)methodA{ NSLog(@"ClassA methodA exec"); } - (void)methodB{ NSLog(@"ClassA methodB exec"); } @end
2014-09-25 14:27:17.751 ProtocolAndDelegate[380:60b] ClassA methodA exec 2014-09-25 14:27:17.752 ProtocolAndDelegate[380:60b] ClassA methodB exec
7.respondsToSelector容錯處理
協議中的方法若是沒有被真正實現,程序是能夠編譯經過的,可是在運行的時候會出錯。特別的是可選實現的方法,未被真正實現的可能性極高,直接調用protocol方法出錯的可能性極高。
規定:「出席今天的宴會,能夠打領帶,也能夠不打領帶」 紳士打了領帶;屌絲爲打領帶。 此時若是直接去全部赴宴者領帶上的花紋,就會出現異常。先判斷下這個赴宴者有沒有打領帶,若是有再獲取領帶上的花紋。
處理辦法以下:
- (void)viewDidLoad { [super viewDidLoad]; ClassA *a = [[ClassA alloc] init]; if ([a respondsToSelector:@selector(methodA)]) { [a methodA]; } if ([a respondsToSelector:@selector(methodB)]) { [a methodB]; } }