【Objective-C基础】委托、非正式协议、正式协议

来源:互联网 发布:跨平台数据库开发工具 编辑:程序博客网 时间:2024/06/05 15:32
原文:http://blog.csdn.net/jjunjoe/article/details/7846025
一、概念简介
1、委托(delegate,也叫代理):当一个对象接受到某个事件或者通知的时候,会向它的Delegate对象查询它是否能够响应这个事件或者通知,如果可以,这个对象就会给它的Delegate对象发送一个消息(执行一个方法调用)。在这种机制下,您可以不进行子类化和方法重载,而是将自己的定制代码放到委托对象中,从而避免对复杂对象进行修改。当您感兴趣的事件发生时,复杂对象会将消息发送给您定制的委托对象。您可以通过这种“挂钩”执行自己的定制代码,实现需要的行为。
2、非正式协议(informal protocol):使用类别category来实现,非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托, 我们可以使用选择器来判断该非正式协议中是否有这个方法。
关于类别的更多内容请参考《【Objective-C基础】类别Category
3、正式协议(formal protocol):是一个命名的方法列表,与非正式协议相比不同的是,它要求显示的采用协议,采用协议的方法是在类的@interface声明中列出协议的名称,此时,实现协议的类应该遵守协议,承诺实现协议中的所有方法,否则编译器将会发出警告。
正式协议协议类似JAVA的interface,也类似于C++的纯虚函数,协议只有声明,没有实现,用来在子类中实现,协议中的方法有两类属性,@required(默认)和@optional两种,@required属性的要求实现协议的类必须要实现这种方法,而@optional属性的方法则不要求,如果不确定协议是否被实现,可以使用respondsToSelector:@select()来判断。
二、应用举例
示例1
简单的委托举例
委托对象的.h头文件

@interface A :NSObject
-(void)Log;
@end

委托对象的.m实现文件

@implementation A
-(void)Log{
    NSLog(@"This is A Log");
}
@end

.h头文件

@interface B :NSObject{
   A* delegate;
}
@property (nonatomic,retain)A* delegate;
-(void)callLog;
@end

.m实现文件

@implementation B
@synthesize delegate;
-(id)init{
   if (self = [superinit] ) {
        delegate = [[Aalloc]init];
    }
    returnself;
}
-(void)callLog{
    
    NSLog(@"This is B callLog");
    [self.delegateLog];
}
@end



int main(int argc,char *argv[])
{
    @autoreleasepool {
        
       //委托的使用
       B* b = [[B alloc]init];
        [bcallLog];
       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

示例2
.h头文件

@interface NSObject(myCategory)
-(void)informal_protocol_print;
@end

.m实现文件

@implementation NSObject(myCategory)
-(void)informal_protocol_print{
    NSLog(@"This is informal_protocol_print");
}
@end


int main(int argc,char *argv[])
{
    @autoreleasepool {
        [b informal_protocol_print];//非正式协议的使用
        NSLog(@"---------------------------------");
       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

示例3
简单的正式协议举例
协议.h头文件
@protocol myProtocol
//可选实现的
@optional
-(void)optional_print;
//要求实现的
@required
-(void)required_print;
@end

使用协议的类的.h文件

@interface  myClass :NSObject<myProtocol>
-(void)print;
@end

使用协议的类的.m文件

@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


int main(int argc,char *argv[])
{
    @autoreleasepool {
       //协议的使用
        myClass *cls = [[myClassalloc]init];
        [cls print];
        [cls optional_print];
        [cls required_print];
        
       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

示例4
正式协议实现委托举例
协议.h头文件

@protocol myProtocolEx
//可选实现的
@optional
-(void)optional_print;
//要求实现的
@required
-(void)required_print;
@end

.h头文件
@interface myClassEx :NSObject{
   id<myProtocolEx> delegate;
}
@property (nonatomic,assign)id<myProtocolEx> delegate;
-(void)print;
@end
.m实现文件
@implementation myClassEx
@synthesize delegate;
-(void)print{
    NSLog(@"This is myClassEx print");
    [self.delegateoptional_print];
    [self.delegaterequired_print];
}
@end

委托对象的.h头文件

@interface myCall :NSObject<myProtocol>{
   myClassEx *cls;
}
@property (nonatomic,retain)myClassEx *cls;
-(void)callPrint;
@end

委托对象的.m头文件

@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 {
       //正式协议实现委托的使用
       myCall *call = [[myCallalloc]init];
        [callcallPrint];
        NSLog(@"---------------------------------");
       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

结束!
0 0
原创粉丝点击