ios----protocol, optional ,delegate
ios----protocol,delegate
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 |
posted on 2014-02-09 18:06 ACM_Someone like you 閱讀(991) 評論(0) 收藏 舉報
浙公網安備 33010602011771號