首页 > 其他 > 详细

OC 协议与代理模式

时间:2015-11-08 15:26:12      阅读:246      评论:0      收藏:0      [点我收藏+]

一.协议的定义: 

@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;

}




OC 协议与代理模式

原文:http://my.oschina.net/u/2483162/blog/527625

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!