protocol——協議
協議是用來定義對象的屬性,行為和用於回調的。
協議中有兩個關鍵字@private和@optional,@private表示使用這個協議必須要寫的方法,@optional表示可選的方法,用不到可以不寫。
就像UITableView,它有兩個協議:UITableViewDelegate和UITableViewDataSource,UITableViewDelegate是規定行為操作的,裡面的方法都是可選的方
法,UITableViewDataSource是規定資料存放區結構的,有兩個必選方法。因此你再實現UITableViewDataSource時必須要定義這兩個方法,否則程式會出錯。
如果你使用了響應的類或者控制項,如果該類定義了協議,就可以根據需要實現該協議。
protocol和java裡interface的概念類似,是Objective-C文法的一部分。
定義protocol如下
@protocol ClassADelegate - (void)methodA;- (void)methodB; @end
那麼就是定義了一組函數,這組函數放在一起叫作一個protocol,也就是協議。
函數是需要被實現的,所以如果對於class如下
@interface ClassB <ClassADelegate> {}@end
就叫作ClassB conform to protocol ClassADelegate,也就是說ClassB實現了這個協議,
也就是實現了這一組函數。
有了上面這個標頭檔,我們就可以放心作調用
ClassB *b = [[ClassB alloc] init];[b methodA];[b methodB];
而不用擔心出現unrecognized selector sent to instance這種錯誤了。
所以protocol就是一組函數定義,是從類聲明中剝離出來的一組定義。
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