IOS学习笔记-Protocol(协议-委托)
来源:互联网 发布:免费地方门户源码 编辑:程序博客网 时间:2024/05/21 17:24
确切来说,协议[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学习笔记-Protocol(协议-委托)
- IOS学习笔记之协议与委托
- ios委托delegate与协议protocol
- 【初学】Objective-C学习笔记-委托代理(delegate)和协议(protocol)
- 协议(protocol) & 委托(delegate)
- ios自用学习笔记一委托协议的简单了解
- 【iOS开发】协议与委托 (Protocol and Delegate) 实例解析
- iOS开发 协议与委托(Protocol and Delegate)
- 【iOS开发】协议与委托 (Protocol and Delegate)
- iOS开发】协议与委托 (Protocol and Delegate) 实例解析
- 【iOS开发】协议与委托 (Protocol and Delegate) 实例解析
- iOS 委托Delegate和协议Protocol的理解和应用
- ios编程思想:委托实现方式1 - 协议方式(protocol)
- IOS学习之协议protocol - 杂七杂八
- iOS 之 协议(protocol)的学习
- 协议(protocol) & 委托(delegate)
- 协议(protocol)和委托(delegate)
- 协议(protocol)委托代理
- poj 1861 Network (kruskal)
- 修改已经完成的项目的默认类前缀
- 关于epoll的ET模式
- char *和String的区别
- Xcelsius 使用XML做为数据源 ----利用ASP与数据库进行交互,即时刷新
- IOS学习笔记-Protocol(协议-委托)
- jquery圆环
- li行间距大(IE中多了5个像素)的解决方法
- JavaScript中With 语句使用方法实例
- 以太网UDP最大报文长度
- Javascript中的with
- 计算机视觉、模式识别、机器学习常用牛人主页链接
- Xcode5制作Framework
- android中src和background区别