您的位置:首页 > 其它

OC 协议与代理模式

2015-11-08 00:00 417 查看
摘要: 协议与代理模式相关的定义与用法

一.协议的定义:

@protocol 协议名 <NSObject>

//协议方法的声明 是对象方法

二.协议的使用:

1.遵循一个协议 类名:NSObject <协议名>

2.遵循多个协议 类名:NSObject <协议名1,协议名2>

3.类没有遵守协议 但是用下面方法可以使对象遵守协议 也可以实现协议中方法

Dog<myProtocol> *dog = [[Dog alloc]init];

4.判断对象是否有没有协议中方法的实现

if ([dog respondsToSelector:@selector(say)])

{

[dog say];

}

5.协议中只能用@property去使用set和get方法 不能设置成员变量

三.协议中方法的实现 在遵循协议的类的.m文件中实现

四.代理模式

给需要代理的类设置一个代理属性 要在类的头文件中导入协议的头文件

@property(nonatomic,strong) id <cureDelegate> delegate;

被代理的类遵守协议

@interface Doctor : NSObject<cureDelegate>

被代理的类实现协议中定义的方法

在需要代理的类的.m文件中利用设置的代理属性调用协议中的方法完成代理过程

[self.delegate cure];

主函数中要给需要代理的类设置代理对象

sicker.delegate = doctor;

需要代理的类的对象调用自己的方法

协议的具体实例

医生遵守一份协议给病人治病

cureDelegate.h

@protocol cureDelegate <NSObject>
//定义一个治病的方法在协议里

-(void) cure;

@end

sicker.h

#import <Foundation/Foundation.h>
#import "CureDelegate.h"

@interface Sicker : NSObject
@property(nonatomic,strong) NSString *sickerName;
//给病人设置一个代理属性 是id类型 但是前提是该类型要遵循代理的协议
@property(nonatomic,strong) id <cureDelegate> delegate;

//病人的生病方法
-(void)ill;

@end

sicker.m

#import "Sicker.h"

@implementation Sicker
//病人生病方法的实现
-(void)ill
{
NSLog(@"%@生病了",_sickerName);
//调用代理对象中的治病方法
[self.delegate cure];
}

@end

Doctor.h

#import <Foundation/Foundation.h>
#import "CureDelegate.h"

//doctor遵循治病协议给病人治病
@interface Doctor : NSObject<cureDelegate>
@property(nonatomic,strong) NSString *doctorName;

@end

Doctor.m

#import "Doctor.h"

@implementation Doctor

//doctor实现协议中治病的方法
-(void)cure
{
NSLog(@"%@医生把病看好了",_doctorName);
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Doctor.h"
#import "Sicker.h"

int main(int argc, const char * argv[]) {

//实例化doctor对象
Doctor *doctor = [[Doctor alloc]init];
doctor.doctorName = @"李明";

//实例化sicker对象
Sicker *sicker = [[Sicker alloc]init];
sicker.sickerName = @"小王";

//给病人设置代理
sicker.delegate = doctor;

//调用病人生病方法
[sicker ill];

代理模式的具体实例

小王想要追花花 不用好意思 因此让小张帮忙给花花送花和巧克力
Protocol.h

//定义一份协议
@protocol myPotocol <NSObject>
//在协议中声明送花和送巧克力的方法
-(void)sendFlower;
-(void)sendChocolate;

@end

PersonI.h

#import <Foundation/Foundation.h>
#import "protocol.h"
#import "PersonII.h"

@interface PersonI : NSObject
@property(nonatomic,strong) NSString *name;
@property(nonatomic,strong) PersonII *person;
//小王中有一个遵守协议的代理对象
@property(nonatomic,strong) id<myPotocol> delegate;
-(void)chaseXiaohua;
@end

PersonI.m

@implementation PersonI
-(void)chaseXiaohua
{
NSLog(@"%@要追小花,请%@帮他",_name,[self valueForKeyPath:@"person.name"]);
//小王通过代理调用协议中的方法
[self.delegate sendFlower];
[self.delegate sendChocolate];
}

PersonII.h

#import <Foundation/Foundation.h>

#import "protocol.h"

//小张遵守协议
@interface PersonII : NSObject<myPotocol>
@property(nonatomic,strong) NSString *name;

@end

PersonII.m

#import "PersonII.h"

@implementation PersonII
//小张遵守了协议 所以小张实现协议中方法
-(void)sendFlower
{
NSLog(@"%@给小花送花",_name);
}

-(void)sendChocolate
{
NSLog(@"%@给小花送巧克力",_name);

}
@end

main.m

#import <Foundation/Foundation.h>
#import "PersonI.h"
#import "PersonII.h"

int main(int argc, const char * argv[]) {

//实例化小王对象
PersonI *xiaowang = [[PersonI alloc]init];
xiaowang.name = @"小王";

//实例化小张对象
PersonII *xiaozhang = [[PersonII alloc]init];
xiaozhang.name = @"小张";

//给小王设置代理对象 对象是小张
xiaowang.delegate = xiaozhang;

//给小王设置person对象 是小张 目的是在小王的文件中通过KVC拿到小张的名字
xiaowang.person = xiaozhang;

//小王调用自己的方法
[xiaowang chaseXiaohua];

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: