您的位置:首页 > 移动开发 > IOS开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: