【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
- 【Objective-C基础】委托、非正式协议、正式协议
- Objective-C 委托、非正式协议、正式协议
- Objective-C非正式协议与正式协议
- Objective-C非正式协议与正式协议
- Objective-C非正式协议与正式协议
- Objective-C非正式协议与正式协议
- Objective-C非正式协议与正式协议
- iOS学习笔记07—Objective-C 委托、非正式协议、正式协议
- iOS学习笔记07—Objective-C 委托、非正式协议、正式协议
- Objective-C 的正式协议和非正式协议
- objective-C中的"非正式协议"和“正式协议”
- Objective-C(八、正式协议Protocol,非正式协议informal protocol)——iOS开发基础
- Objective-c - 非正式协议
- 非正式协议/正式协议
- 非正式协议/正式协议
- ObjC(Objective-C)中的"非正式协议(interface)"与"正式协议(protocal)"
- ObjC(Objective-C)中的"非正式协议(interface)"与"正式协议(protocal)"
- objective-C中的接口与泛型("非正式协议(interface)"与"正式协议(protocal)")
- 【Objective-C基础】自动释放池
- 被遗忘的技术点---JAVA
- 服务器进程fork两次原理
- srs之forward对接
- ubuntu16.04安装caffe以及各种问题汇总
- 【Objective-C基础】委托、非正式协议、正式协议
- BigDecimal 加减乘除运算
- 移动端WebApp隐藏地址栏的方法
- 设置iframe高度自适应
- spring-mvc
- hibernate注解(二)
- 常用方法
- NSString 基本用法
- python词云 wordcloud入门