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


摘自:
http://blog.csdn.net/mars2639/article/details/7310182java

相關文章
相關標籤/搜索