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;

}

相關文章
相關標籤/搜索