protocol及代理模式应用及理解

来源:互联网 发布:svd求逆矩阵 编辑:程序博客网 时间:2024/04/29 01:59

一、定义协议

协议就是一些方法的声明,一般写到一个.h的头文件中.

协议的定义:(默认情况下遵守 NSObject协议)

    @protocol 协议名称

    @end

声明的方法有两种:

    1,必须实现的方法;required

    2,选择实现的方法;optional


,遵守协议

(让某个类遵守协议,一个类可以遵守多个协议,<>中用逗号隔开)

   1) 遵守一个协议:(先导入协议的头文件)

    @interface 类名 :NSObject <<spanstyle="line-height: normal;">要遵守的协议名称>

  @end

  2) 遵守多个协议

    @interface 类名 :NSObject <<spanstyle="line-height: normal;">要遵守的协议名称,要遵守的协议名称,要遵守的协议名称>

   @end


,实现协议中的方法

(在类的.m文件中实现协议中的方法)

    1),定义一个协议:

    @protocol baseProtocol

    //声明一些方法

    -(void)eat;

    -(void)run;

    @end

  2),让类遵守这个协议

    // 1) 导入 头文件

    #import "baseProtocol.h"

    @interface Person :NSObject

    @end

 3),在类的.m文件中实现协议的方法

    @implementation Person

    -(void)eat{

       NSLog(@"长得漂亮又能吃,吃货,长得丑,又能吃,叫饭桶");

    }

    -(void)run{

     NSLog(@"人会跑");

  }

@end

    结论: 当一个类遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明

1,一个协议也可以遵守其他的协议;

    @protocol workProtocol

    @end

   #import "workProtocol.h"

    @protocol baseProtocol

    @end

protocol的其他用法:

    1),不能声明成员变量;

   2),只要父类遵守了某个协议,那么子类也遵守;

   3),OC中的类可以遵守多个协议;

    4),基协议是NSObject;

   5),协议可以遵守多个协议;

2,@required @optional 都是协议中的关键字

   @required 修饰的方法是必须要实现的,如果不实现,编译器会发出警告,默认

   @optional 修饰的方法是可以实现,也可以不实现的

3,protocol类型限制

   第一种类型限制:

  id类型增加限制

       id obj;

    增加以后,表示,obj只能赋值遵守了houseHold协议的对象

   第二种类型限制:

    表示,obj2赋值的时候,必须是Girl对象,并其遵守了houseHold协议.

       Girl *obj2;

   格式:

      对象<</span>协议名称> 对象指针;  (通过协议,对这个对象做一些限制)

4,idinstancetype的区别

   1).都能作为函数的参数返回值

   2).id能作为方法或者函数的返回值、参数类型,也能用来定义变量

    3).instancetype 能精确限制返回值类型

5,代理模式 (传入的对象,代替当前类完成了某个功能,称为代理模式)

思路:

   1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现

    findHouse方法

       @protocol findHouseProtocol

       -(void)findHouse;

       @end

   2)创建一个代理类(比如LinkHome),遵守上面的代理协议

       @interface LinkHome : NSObject

       @end

   3)在需要代理的类中(Student),定义一个对象类型为id且遵守代理协议的成员变量

    @property(nonatomic,strong)id delegate;

   4)Student类中调用成员变量_delegate(代理)的方法,调用代理类的方法

    [self.delegatefindHouse];

   5)main.m或其他使用Student类的文件中,Student类的成员变量(代理类)赋值

        LinkHome *linkHome =[LinkHome new];

        stu.delegate = linkHome;

6,@protocol关键字,告诉编译器,这是一个协议.

.m文件中使用的时候,需要导入这个协议.

    @protocolPersonProtocol声明一个协议.

    @class Person 声明一个类。


#pragma mark main.m

#import

#import"Person.h"

intmain(intargc, constchar* argv[]) {

   @autoreleasepool {

      Person*p =[Personnew];

       [prun];

       [p eat];

       [pwork];

   }

    return0;

}


#pragma mark baseProtocol.h

#import

//基础协议

// eat  run

//Person 采纳这个协议

//定义一个协议

//使用协议的流程:

// --> 定义协议

//--> 让类遵守这个协议

//--> 实现协议中对应的方法(必须要实现的)

#import"workProtocol.h"

@protocolbaseProtocol <<span style="font-variant-ligatures:no-common-ligatures; color: #703daa">NSObject,workProtocol>

//声明一些方法

-(void)eat;

-(void)run;

@end


#pragma mark Person.h

#import

//遵守协议的步骤:

// 1) 导入头文件

#import"baseProtocol.h"

//#import "workProtocol.h"

// 2) 遵守协议

// 3) 实现方法

//结论:当我们遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明

@interfacePerson : NSObject<<spanstyle="font-variant-ligatures: no-common-ligatures; color:#4f8187">baseProtocol>

@end


#pragma mark Person.m

#import"Person.h"

@implementation Person

-(void)eat{

   NSLog(@"长得漂亮又能吃,吃货,长得丑,又能吃,叫饭桶");

}

-(void)run{

   NSLog(@"人会跑");

}

-(void)work{

    NSLog(@"今天工作不努力,明天努力找工作");

}

@end


#pragma mark workProtocol.h

#import

@protocolworkProtocol<<span style="font-variant-ligatures: no-common-ligatures;color: #703daa">NSObject>

-(void)work;

@end


代理模式的代码实现:

#pragma mark main.m

#import

#import"BaoMu.h"

#import "Baby.h"

intmain(intargc, constchar* argv[]) {

   @autoreleasepool {

      BaoMu*baomu =[BaoMunew];

       Baby*baby = [Babynew];

       baby.blood= 30;

       baby.sleep= 20;

       baby.bm= baomu;

       [baby wantEat];

       [baby wantSleep];

      NSLog(@"%.2f,%.2f",baby.blood,baby.sleep);

   }

    return0;

}


#pragma mark Baby.h

#import

@class BaoMu;

#import"lookBabyProtocol.h"

@interface Baby: NSObject

@property (nonatomic,assign)float blood;

@property (nonatomic,assign)float sleep;

//保姆、体力值、睡眠值

@property(nonatomic,strong)BaoMu<</span>lookBabyProtocol>*bm;// id delegate;

-(void)wantEat;

-(void)wantSleep;

@end


#pragma mark Baby.m

#import "Baby.h"

#import"BaoMu.h"

@implementation Baby

-(void)wantEat{

    NSLog(@"婴儿在哭...");

   //保姆要喂它吃

   [self.bmfeedBabyEat:self];

}

-(void)wantSleep{

    NSLog(@"婴儿在哭...");

   //保姆哄婴儿睡觉

   [self.bmHongBabySleep:self];

}

@end


#pragma mark Baomu.h

#import

//保姆想成为baby的代理人,就必须遵守lookBabyProtocol协议

#import"lookBabyProtocol.h"

@interfaceBaoMu :NSObject<</span>lookBabyPrwotocol>

@end


#pragmamark  Baomu.m

#import"BaoMu.h"

#import "Baby.h"

@implementation BaoMu

//喂婴儿吃饭

-(void)feedBabyEat:(Baby*)baby{

    baby.blood+= 20;

   NSLog(@"保姆正在喂婴儿吃东西,baby.blood= %.2f",baby.blood);

}

//哄婴儿睡觉

-(void)HongBabySleep:(Baby*)baby{

   baby.sleep+= 10;

   NSLog(@"保姆正在哄婴儿睡觉,baby.sleep= %.2f",baby.sleep);

}

@end


#pragma mark lookBabyProtocol.h

#import

@class Baby;

@protocollookBabyProtocol <<span style="font-variant-ligatures:no-common-ligatures; color: #703daa">NSObject>

//喂婴儿吃饭

-(void)feedBabyEat:(Baby*)baby;

//哄婴儿睡觉:(Baby*)baby

-(void)HongBabySleep:(Baby*)baby;

@end



0 0
原创粉丝点击