IOS学习笔记-Protocol(协议-委托)
2014-08-19 18:08
399 查看
在IOS开发中协议和委托是两个密不可分的概念(也可以说是不同的设计模式,只不过在这里我们把他们讲在一起,因为我们常常都是这么用的)
确切来说,协议[protocol]定义了一种规范,使遵循它的类具备一种能力。委托[delegate]则是制定了一种"一个类中需要做的事情交给另一个类来完成"的途径,通过委托别的类,来调用协议里的方法,
委托也可以说是Object-C中实现多继承的一种方式。
一、协议
1、协议相当于没有基类相关的接口,声明了一组方法,列出它的参数和返回值,共享给其他类使用,自己不进行实现让用它的类型实现这些方法
2、在任何一个类中,只要声明了协议,都可以实现协议里的方法
3、协议不是一个类,没有父类
4、协议里面的方法经常都是一些委托方法
二、委托
委托,故名思议就是托别人办事。
协议的声明格式:
@protocol 协议名
声明方法
@end
其中"声明方法"可以用@required和@optional关键字修饰:
@required 表示我们用到这个协议的时候必须实现这个协议的方法(实际上即使不实现也不会出错)
@optional 表示我们可选择性实现这些方法。
一个类需要遵循的协议在接口声明中的<>填写即可。
理解协议和委托的关系我们需要搞清楚如下几个问题:
1,一个对象的委托是哪个对象,需要干什么事情;
2,被委托的类需要在自身的interface中声明协议:<XXXDelega>,表示该来需要实现XXXDelega协议的方法。
3,在被委托的类里定义一个委托类的对象,并设置XXX.dalegate = self。把本类设置成委托对象。然后在本类中实现协议方法。
委托与协议示例(实现协议的负责干活,委托时委托给别人干活)
如公司管理,在公司中老板负责日常公司的管理,而起草文件,接听电话,首发电子则有秘书负责来做,
对秘书的要求就是起草文件,接听电话,收发电子邮件,这三项便是协议
1、声明协议
#import <Foundation/Foundation.h>
@class Staff;
@protocol TaskDelegate <NSObject>
@required
-(void)DrawDocument:(Staff *)staff;
-(void)ReceiveAndSendEmail:(Staff *)staff;
@optional
-(void)Telphone:(Staff *)staff;
@end
2、声明秘书类
#import <Foundation/Foundation.h>
#import "TaskDelegate.h"
@interface Staff : NSObject<TaskDelegate>
@property(nonatomic,retain)NSString *staffName;
-(id)initWith:(NSString *)name;
@end
#import "Staff.h"
@interface Staff()
@end
@implementation Staff
@synthesize staffName;
-(id)initWith:(NSString *)name{
self= [super init];
if(self){
self.staffName = name;
}
return self;
}
-(void)DrawDocument:(Staff *)staff{
NSLog(@"%@ 正在起草文件",staff.staffName);
}
-(void)Telphone:(Staff *)staff{
NSLog(@"%@ 正在接听电话",staff.staffName);
}
-(void)ReceiveAndSendEmail:(Staff *)staff{
NSLog(@"%@ 收发了今天的电子邮件",staff.staffName);
}
@end
3、声明老板类
#import <Foundation/Foundation.h>
#import "TaskDelegate.h"
@interface Boss : NSObject
//很重要的属性-此属性对象必须实现protocol协议。在实际使用过程中常常用self.delegate = XXX.
@property(nonatomic,retain)id<TaskDelegate> delegate;
//必须有一个protocol类的对象,在实际使用过程中需要配置这里的delegate指向代理对象。
-(void)BossWork;
-(void)BossAskTel:(Staff *)staff;
@end
#import "Boss.h"
@implementation Boss
@synthesize delegate;
-(void)BossWork{
NSLog(@"老板日常管理工作");
}
-(void)BossAskTel:(Staff *)staff{
//委托员工完成
if([self.delegate respondsToSelector:@selector(Telphone:)]){
[self.delegate Telphone:staff];
}
if([self.delegate respondsToSelector:@selector(ReceiveAndSendEmail:)]){
[self.delegate ReceiveAndSendEmail:staff];
}
if([self.delegate respondsToSelector:@selector(DrawDocument:)]){
[self.delegate DrawDocument:staff];
}
}
@end
//调用
Staff *staff =[[[Staff alloc] initWith:@"zhangsan"] autorelease];
Boss *boss = [[[Boss alloc] init] autorelease];
boss.delegate =staff;
[boss BossWork];
[boss BossAskTel:staff];
或者使用下面方式
修改员工类
#import <Foundation/Foundation.h>
#import "TaskDelegate.h"
#import "Boss.h"
@interface Staff : NSObject<TaskDelegate>
@property(nonatomic,retain)NSString *staffName;
-(id)initWithName:(NSString *)name ManagerLeader:(Boss *)boss;
@end
#import "Staff.h"
@interface Staff()
@end
@implementation Staff
@synthesize staffName;
-(id)initWith:(NSString *)name{
self= [super init];
if(self){
self.staffName = name;
}
return self;
}
-(id)initWithName:(NSString *)name ManagerLeader:(Boss *)boss{
self= [super init];
if(self){
self.staffName = name;
}
boss.delegate = self;
return self;
}
-(void)DrawDocument:(Staff *)staff{
NSLog(@"%@ 正在起草文件",staff.staffName);
}
-(void)Telphone:(Staff *)staff{
NSLog(@"%@ 正在接听电话",staff.staffName);
}
-(void)ReceiveAndSendEmail:(Staff *)staff{
NSLog(@"%@ 收发了今天的电子邮件",staff.staffName);
}
@end
调用的时候代码如下:
Boss *boss = [[[Boss alloc] init] autorelease];
Staff *staff =[[Staff alloc] initWithName:@"zhangsan" ManagerLeader:boss];
[boss BossAskTel:staff];
其他应用示例参考
自定义复选框:http://blog.csdn.net/u011872945/article/details/17889573
自定义单选按钮:http://blog.csdn.net/u011872945/article/details/17891323
确切来说,协议[protocol]定义了一种规范,使遵循它的类具备一种能力。委托[delegate]则是制定了一种"一个类中需要做的事情交给另一个类来完成"的途径,通过委托别的类,来调用协议里的方法,
委托也可以说是Object-C中实现多继承的一种方式。
一、协议
1、协议相当于没有基类相关的接口,声明了一组方法,列出它的参数和返回值,共享给其他类使用,自己不进行实现让用它的类型实现这些方法
2、在任何一个类中,只要声明了协议,都可以实现协议里的方法
3、协议不是一个类,没有父类
4、协议里面的方法经常都是一些委托方法
二、委托
委托,故名思议就是托别人办事。
协议的声明格式:
@protocol 协议名
声明方法
@end
其中"声明方法"可以用@required和@optional关键字修饰:
@required 表示我们用到这个协议的时候必须实现这个协议的方法(实际上即使不实现也不会出错)
@optional 表示我们可选择性实现这些方法。
一个类需要遵循的协议在接口声明中的<>填写即可。
理解协议和委托的关系我们需要搞清楚如下几个问题:
1,一个对象的委托是哪个对象,需要干什么事情;
2,被委托的类需要在自身的interface中声明协议:<XXXDelega>,表示该来需要实现XXXDelega协议的方法。
3,在被委托的类里定义一个委托类的对象,并设置XXX.dalegate = self。把本类设置成委托对象。然后在本类中实现协议方法。
委托与协议示例(实现协议的负责干活,委托时委托给别人干活)
如公司管理,在公司中老板负责日常公司的管理,而起草文件,接听电话,首发电子则有秘书负责来做,
对秘书的要求就是起草文件,接听电话,收发电子邮件,这三项便是协议
1、声明协议
#import <Foundation/Foundation.h>
@class Staff;
@protocol TaskDelegate <NSObject>
@required
-(void)DrawDocument:(Staff *)staff;
-(void)ReceiveAndSendEmail:(Staff *)staff;
@optional
-(void)Telphone:(Staff *)staff;
@end
2、声明秘书类
#import <Foundation/Foundation.h>
#import "TaskDelegate.h"
@interface Staff : NSObject<TaskDelegate>
@property(nonatomic,retain)NSString *staffName;
-(id)initWith:(NSString *)name;
@end
#import "Staff.h"
@interface Staff()
@end
@implementation Staff
@synthesize staffName;
-(id)initWith:(NSString *)name{
self= [super init];
if(self){
self.staffName = name;
}
return self;
}
-(void)DrawDocument:(Staff *)staff{
NSLog(@"%@ 正在起草文件",staff.staffName);
}
-(void)Telphone:(Staff *)staff{
NSLog(@"%@ 正在接听电话",staff.staffName);
}
-(void)ReceiveAndSendEmail:(Staff *)staff{
NSLog(@"%@ 收发了今天的电子邮件",staff.staffName);
}
@end
3、声明老板类
#import <Foundation/Foundation.h>
#import "TaskDelegate.h"
@interface Boss : NSObject
//很重要的属性-此属性对象必须实现protocol协议。在实际使用过程中常常用self.delegate = XXX.
@property(nonatomic,retain)id<TaskDelegate> delegate;
//必须有一个protocol类的对象,在实际使用过程中需要配置这里的delegate指向代理对象。
-(void)BossWork;
-(void)BossAskTel:(Staff *)staff;
@end
#import "Boss.h"
@implementation Boss
@synthesize delegate;
-(void)BossWork{
NSLog(@"老板日常管理工作");
}
-(void)BossAskTel:(Staff *)staff{
//委托员工完成
if([self.delegate respondsToSelector:@selector(Telphone:)]){
[self.delegate Telphone:staff];
}
if([self.delegate respondsToSelector:@selector(ReceiveAndSendEmail:)]){
[self.delegate ReceiveAndSendEmail:staff];
}
if([self.delegate respondsToSelector:@selector(DrawDocument:)]){
[self.delegate DrawDocument:staff];
}
}
@end
//调用
Staff *staff =[[[Staff alloc] initWith:@"zhangsan"] autorelease];
Boss *boss = [[[Boss alloc] init] autorelease];
boss.delegate =staff;
[boss BossWork];
[boss BossAskTel:staff];
或者使用下面方式
修改员工类
#import <Foundation/Foundation.h>
#import "TaskDelegate.h"
#import "Boss.h"
@interface Staff : NSObject<TaskDelegate>
@property(nonatomic,retain)NSString *staffName;
-(id)initWithName:(NSString *)name ManagerLeader:(Boss *)boss;
@end
#import "Staff.h"
@interface Staff()
@end
@implementation Staff
@synthesize staffName;
-(id)initWith:(NSString *)name{
self= [super init];
if(self){
self.staffName = name;
}
return self;
}
-(id)initWithName:(NSString *)name ManagerLeader:(Boss *)boss{
self= [super init];
if(self){
self.staffName = name;
}
boss.delegate = self;
return self;
}
-(void)DrawDocument:(Staff *)staff{
NSLog(@"%@ 正在起草文件",staff.staffName);
}
-(void)Telphone:(Staff *)staff{
NSLog(@"%@ 正在接听电话",staff.staffName);
}
-(void)ReceiveAndSendEmail:(Staff *)staff{
NSLog(@"%@ 收发了今天的电子邮件",staff.staffName);
}
@end
调用的时候代码如下:
Boss *boss = [[[Boss alloc] init] autorelease];
Staff *staff =[[Staff alloc] initWithName:@"zhangsan" ManagerLeader:boss];
[boss BossAskTel:staff];
其他应用示例参考
自定义复选框:http://blog.csdn.net/u011872945/article/details/17889573
自定义单选按钮:http://blog.csdn.net/u011872945/article/details/17891323
相关文章推荐
- ios自用学习笔记一委托协议的简单了解
- iOS学习笔记(2)UIWebViewDelegate委托协议定义的方法
- IOS学习笔记之协议与委托
- iOS阶段学习第19天笔记(协议-Protocol)
- iOS学习笔记07—Objective-C 委托、非正式协议、正式协议
- ios委托delegate与协议protocol
- 开源中国iOS客户端学习——(三)再看协议与委托
- IOS学习笔记-协议和代码块
- 【IOS学习】之四、协议,委托,分类粗解
- ((ios开发学习笔记))实现委托总结
- ios学习笔记(二)之Objective-C类、继承、类别和协议
- 【IOS学习】之四、协议,委托,分类粗解
- IOS学习笔记59-Retain、Copy以及Copy协议探讨
- iOS开发 协议与委托(Protocol and Delegate)
- IOS学习笔记5—Objective C—类别和协议
- 【iOS开发】协议与委托 (Protocol and Delegate) 实例解析
- ios学习笔记(二)之协议
- 【初学】Objective-C学习笔记-委托代理(delegate)和协议(protocol)
- Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明