protocol——協議 協議是用來定義對象的屬性,行爲和用於回調的。 協議中有兩個關鍵字@private和@optional,@private表示使用這個協議必需要寫的方法,@optional表示可選的方法,用不到能夠不寫。 就像UITableView,它有兩個協議:UITableViewDelegate和UITableViewDataSource,UITableViewDelegate是規定行爲操做的,裏面的方法都是可選的方 法,UITableViewDataSource是規定數據存儲結構的,有兩個必選方法。所以你再實現UITableViewDataSource時必需要定義這兩個方法,不然程序會出錯。 若是你使用了響應的類或者控件,若是該類定義了協議,就能夠根據須要實現該協議。 protocol和java裏interface的概念相似,是Objective-C語法的一部分。 定義protocol以下 [cpp] view plaincopyprint? 1 2 3 4 5 6 @protocol ClassADelegate - (void)methodA; - (void)methodB; @end 那麼就是定義了一組函數,這組函數放在一塊兒叫做一個protocol,也就是協議。 函數是須要被實現的,因此若是對於class以下 [cpp] view plaincopyprint? @interface ClassB <ClassADelegate> { } @end 就叫做ClassB conform to protocol ClassADelegate,也就是說ClassB實現了這個協議, 也就是實現了這一組函數。 有了上面這個頭文件,咱們就能夠放心做調用 [cpp] view plaincopyprint? ClassB *b = [[ClassB alloc] init]; [b methodA]; [b methodB]; 而不用擔憂出現unrecognized selector sent to instance這種錯誤了。 因此protocol就是一組函數定義,是從類聲明中剝離出來的一組定義。 [cpp] view plaincopyprint? id<ClassADelegate> b = ...; [b methodA]; 這種用法也常見,b是一個id類型,它知道ClassADelegate這組函數的實現。 delegate——委託,代理 適用場合: 類A調用類B, 當類B想回調類A的方法的時候, 要用到delegate 要理解下面的代碼的話, 要知道的一個知識點是 協議(protocal) 文件:ClassA.h #import <Foundation/Foundation.h> #import "ClassB.h" @interface ClassA : NSObject<SampleProtocal> - (void)test; @end 文件:ClassA.m #import "ClassA.h" @implementation ClassA -(void)test{ ClassB *classB = [[ClassB alloc] init]; classB.delegate = self; [classB actionOfClassB]; } -(void)callback{ NSLog(@"這個方法會被類B調用"); } @end 文件:ClassB.h #import <Foundation/Foundation.h> @protocol SampleProtocal <NSObject> @required - (void)callback; @end @interface ClassB : NSObject{ id<SampleProtocal> delegate; } @property (nonatomic, retain) id<SampleProtocal> delegate; - (void)actionOfClassB; @end 文件:ClassB.m #import "ClassB.h" @implementation ClassB @synthesize delegate; -(void)actionOfClassB{ [delegate callback]; } @end 摘自:http://blog.csdn.net/mars2639/article/details/7310182
|