OC 协议与代理模式

一.协议的定义: 函数

@protocol 协议名 <NSObject>atom

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


二.协议的使用:.net

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

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

3.类没有遵照协议 可是用下面方法能够使对象遵照协议 也能够实现协议中方法orm

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

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

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

   {

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

}

相关文章
相关标签/搜索