標籤:
一、概念:
1、委託(delegate,也叫代理):當一個對象接受到某個事件或者通知的時候,會向它的Delegate物件查詢它是否能夠響應這個事件或者通知,如果可以,這個對象就會給它的Delegate對象發送一個訊息(執行一個方法調用)。在這種機制下,您可以不進行子類化和方法重載,而是將自己的定製代碼放到委派物件中,從而避免對複雜物件進行修改。當您感興趣的事件發生時,複雜物件會將訊息發送給您定製的委派物件。您可以通過這種“掛鈎”執行自己的定製代碼,實現需要的行為。
2、非正式協議(informal protocol):使用類別category來實現,非正式協議是NSObject的一個類別,這樣任何類的對象都可以作為委派物件來使用,它可以列出對象能夠執行的所有方法,這樣用來實現委託, 我們可以使用選取器來判斷該非正式協議中是否有這個方法。
3、正式協議(formal protocol):是一個命名的方法列表,與非正式協議相比不同的是,它要求顯示的採用協議,採用協議的方法是在類的@interface聲明中列出協議的名稱,此時,實現協議的類應該遵守協議,承諾實現協議中的所有方法,否則編譯器將會發出警告。
正式協議協議類似於C++的純虛函數,協議只有聲明,沒有實現,用來在子類中實現,協議中的方法有兩類屬性,@required(預設)和@optional兩種,@required屬性的要求實現協議的類必須要實現這種方法,而@optional屬性的方法則不要求,如果不確定協議是否被實現,可以使用respondsToSelector:@select()來判斷。
二、應用舉例
源碼如下:
/*********簡單的委託舉例************/
@interface A :NSObject
-(void)Log;
@end
@implementation A
-(void)Log{
NSLog(@"This is A Log");
}
@end
@interface B :NSObject{
A* delegate;
}
@property (nonatomic,retain)A* delegate;
-(void)callLog;
@end
@implementation B
@synthesize delegate;
-(id)init{
if (self = [superinit] ) {
delegate = [[Aalloc]init];
}
returnself;
}
-(void)callLog{
NSLog(@"This is B callLog");
[self.delegateLog];
}
@end
/*********簡單的委託舉例************/
/*********簡單的正式協議舉例************/
//協議--begain
@protocol myProtocol
//可選實現的
@optional
-(void)optional_print;
//要求實現的
@required
-(void)required_print;
@end
//協議--end
//使用協議的類--begain
@interface myClass :NSObject<myProtocol>
-(void)print;
@end
@implementation myClass
-(void)print{
NSLog(@"This is myClass print");
}
//實現可選實現的協議
-(void)optional_print{
NSLog(@"This is protocol optional_print");
}
//實現必須實現的協議
-(void)required_print{
NSLog(@"This is protocol required_print");
}
@end
//使用協議的類--end
/*********簡單的正式協議舉例************/
/*********簡單的非正式協議舉例************/
@interface NSObject(myCategory)
-(void)informal_protocol_print;
@end
@implementation NSObject(myCategory)
-(void)informal_protocol_print{
NSLog(@"This is informal_protocol_print");
}
@end
/*********簡單的非正式協議舉例************/
/*********正式協議實現委託舉例************/
//協議--begain
@protocol myProtocolEx
//可選實現的
@optional
-(void)optional_print;
//要求實現的
@required
-(void)required_print;
@end
//協議--end
@interface myClassEx :NSObject{
id<myProtocolEx> delegate;
}
@property (nonatomic,assign)id<myProtocolEx> delegate;
-(void)print;
@end
@implementation myClassEx
@synthesize delegate;
-(void)print{
NSLog(@"This is myClassEx print");
[self.delegateoptional_print];
[self.delegaterequired_print];
}
@end
@interface myCall :NSObject<myProtocol>{
myClassEx *cls;
}
@property (nonatomic,retain)myClassEx *cls;
-(void)callPrint;
@end
@implementation myCall
@synthesize cls;
-(id)init{
if (self=[superinit]) {
myClassEx* c = [[myClassExalloc]init];
self.cls = c;
cls.delegate = (id)self;
[crelease];
}
returnself;
}
-(void)callPrint{
NSLog(@"This is myCall callPrint");
[self.clsprint];
}
-(void)optional_print{
NSLog(@"This is myCall implemented formal protocol optional_print");
}
-(void)required_print{
NSLog(@"This is myCall implemented formal protocol required_print");
}
@end
/*********正式協議實現委託舉例************/
int main(int argc,char *argv[])
{
@autoreleasepool {
//委託的使用
B* b = [[B alloc]init];
[bcallLog];
[b informal_protocol_print];//非正式協議的使用
NSLog(@"---------------------------------");
//協議的使用
myClass *cls = [[myClassalloc]init];
[clsprint];
[clsoptional_print];
[clsrequired_print];
[cls informal_protocol_print];//非正式協議的使用
NSLog(@"---------------------------------");
//正式協議實現委託的使用
myCall *call = [[myCallalloc]init];
[callcallPrint];
NSLog(@"---------------------------------");
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
http://blog.csdn.net/jjunjoe/article/details/7846025
Objective-C 委託、非正式協議、正式協議