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

来源:互联网 发布:免费地方门户源码 编辑:程序博客网 时间:2024/05/21 17:24
在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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 闺蜜给介绍对象怎么办 喜欢对象的发小怎么办 山东省直医保卡丢失怎么办 高铁票如果错过了怎么办 动车错过了时间怎么办 长途动车错过了怎么办 动车如果错过了怎么办 没有取票错过了怎么办 动车出站没检票怎么办 火车晚点耽误了下班车怎么办 动车票中途丢了怎么办 购买二手房异地铁路公积金怎么办 沈阳公积金卡丢了怎么办 住宅专项维修资金用完了怎么办 广州出租车丢了东西怎么办 广州的士丢了东西怎么办 网上找兼职被骗了怎么办 海信空调开不了机怎么办 海信空调遥控器开不了怎么办 学生遭套路贷反被仲裁怎么办 赏脸打错字尝脸怎么办 红掌的花变黑了怎么办 红掌花苞发黑了怎么办 水培植物腐根了怎么办 水培绿萝水发臭怎么办 水里养花根烂掉怎么办 桅子花叶子发黑怎么办 大株月季烂根怎么办 月季水浇多了烂根的怎么办 金桔盆栽烂根怎么办 盆栽的长寿果树烂根怎么办 家里的石榴烂根怎么办 山桔盆栽烂根怎么办 养的植物烂根怎么办 桅子花叶子长霉怎么办 紫薇花叶子干了怎么办 高层玻璃阳台往下看恐高怎么办 比熊放阳台叫怎么办 海员入职体检不合格怎么办 联币金融立案投资人怎么办 联币金融的投资怎么办