IOS学习笔记-Protocol(协议-委托)

本文深入探讨了iOS开发中协议和委托的概念、作用和应用实例,详细阐述了如何通过协议定义接口,以及委托机制如何实现类之间的职责分离和功能调用,通过具体的示例代码展示了其在实际开发中的运用。
在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.youkuaiyun.com/u011872945/article/details/17889573 

自定义单选按钮:http://blog.youkuaiyun.com/u011872945/article/details/17891323

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值