天天看点

黑马程序员---OC学习笔记之protocol概念及基本使用

------Java培训、Android培训、iOS培训、.Net培训--------

一、protocol概念及基本使用

1、protocol的基本概念

1)在写java得时候都会有借口interface这个概念,借口就是一堆方法的声明没有实现。而在OC中,interface是一个类的头文件的声明,并不是真正意义上得接口的意思,在OC中,借口是一个由一个叫做【协议protocol】的来实现的。

2)这个里面可以声明一些方法,和java不同的是,他可以声明一些必须实现和可以选择实现的方法,这个是和java是完全不同的(java接口中的方法必须实现)。

3)【作用】供其他的类去遵守,如果一个雷遵守了一个协议,就应该实现这个协议中必须实现的方法。

2、protoco的使用流程

定义协议--》在类中采用指定的协议--》实现协议中的方法(注意方法有必须实现和选择实现这两种)

【定义协议】

格式:

@protocol 协议名称<NSObject> //默认遵守NSObject协议

//方法声明列表

@end

【注意】协议默认遵守NSObject协议(基协议)

【采纳协议】

1)类遵守协议

创建类的时候遵守某个或者几个协议

@interfa 类名 : 父类 <协议名1,协议名2>

@end

某个协议也可以遵守某个或者某些协议,一个协议可以蹲守其他多个协议

1)协议遵守协议

@protocol 协议名称 <其他协议名>

@end

3、@required和@optional

【用途】程序员之间的交流

@required这个方法必须实现,否则编译器会发出警告,默认是必须实现的

@optional方法是可以选择实现的。

二、protocol的使用注意事项

1、注意事项

1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现

2)只要遵守了某个类协议,就拥有了这个协议中所有的方法声明

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

4)Protocol声明的方法可以让任何类去实现

5)OC不能多继承,但是可以遵守多个协议,多个类也可以遵守同一个协议

6)基协议,<NSObject>是基协议,最最根本的协议,其中生命了很多最基本的方法

7)协议可以遵守协议,一个协议可以遵守另一个协议,就可以拥有另一个协议中声明的方法

2、protocol基协议的介绍

基协议,<NSObject>是基协议,最最根本的协议,其中生命了很多最基本的方法。

最基本的方法有

description

release

retain

三、protocol代理设计模式引入

1、protocol代理设计模式引入

代理模式是在OC中经常遇到的一种设计模式。那什么叫做代理模式呢?

举个例子:有一个婴儿,他本身不会吃饭和自造等等事情。于是婴儿就请了一个保姆,接着婴儿与保姆之间就商定了一个协议,其中写明了保姆需要做什么事情,此时保姆就是这个【代理人】。即:婴儿和保姆之间有协议,保姆遵守该协议,遇事保姆就需要实现该协议中的条款称为代理人。

2、【思考与实现】

【引入】

婴儿饿了要吃东西,困了要睡觉,当婴儿饿了或者额困了都需要保姆照顾,使用类实现此功能。

【第一步,指定协议】

照顾小孩的协议:lookBabyProtocol

 -喂婴儿

 -哄睡觉

【第二步,创建相关类】

 1)婴儿类:Baby

属性值:保姆,体力值、睡眠值

行为:

A、想吃东西---保姆喂奶

B、想睡觉--保姆哄睡觉

2)保姆类(需要遵守协议)

【实现】

【lookBabyProtocol.h文件】

#import <Foundation/Foundation.h>
@class Baby;
@protocol lookBabyProtocol <NSObject>
 
-(void)feedBaby:(Baby*)bb;
 
-(void)sleepyBaby:(Baby*)bb;
@end
           

【BabySister.h文件】

#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"
//遵守协议
@interface BabySister : NSObject<lookBabyProtocol>
 
@end
           

【Baby .h 文件】

#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"
@class BabySister;
 
@interface Baby : NSObject
 
@property(nonatomic,assign) int blood;//血量跟吃饭有关
@property(nonatomic,assign) int activity;//活力跟睡眠有关
//baby有个保姆,这样是BabySister必须遵守协议
@property(nonatomic,strong) BabySister<lookBabyProtocol> *bs;
//想吃了
-(void)wantEat;
//想睡
-(void)wantSleep;
@end
           

【BabySitter.m文件】

#import "BabySister.h"
#import "Baby.h"
@implementation BabySister
 
//实现协议中的方法
 
-(void)feedBaby:(Baby *)baby{
    baby.blood += 50;
    NSLog(@"保姆正在喂宝宝吃安眠药,婴儿血量:%d",baby.blood);
}
 
-(void)sleepyBaby:(Baby *)baby{
    baby.activity += 20;
    NSLog(@"保姆正在哄婴儿睡觉,婴儿活力:%d",baby.activity);
}
@end
           

【Baby.m文件】

#import "Baby.h"
#import "BabySister.h"
@implementation Baby
 
-(void)wantEat{
    //宝宝饿了在哭
    NSLog(@"Baby is cring...");
    //保姆要喂baby
    [self.bs feedBaby:self];
}
 
-(void)wantSleep{
    //宝宝困了
    NSLog(@"Baby want to sleep...");
    //保姆要哄他睡觉
    [self.bs sleepyBaby:self];
}
@end
           

【main.m文件】

#import <Foundation/Foundation.h>
 
#import "BabySister.h"
#import "Baby.h"
 
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        //定义一个保姆对象
        BabySister *bs = [BabySister new];
        //定义一个宝宝对象
        Baby *b = [Baby new];
        b.bs = bs;
        [b wantEat];
        [b wantSleep];
   }
    return 0;
}
 
           

【打印结果】

2015-10-07 18:13:04.538 协议代理引入[1893:303] Baby iscring...

2015-10-07 18:13:04.540 协议代理引入[1893:303] 保姆正在喂宝宝吃安眠药,婴儿血量:50

2015-10-07 18:13:04.541 协议代理引入[1893:303] Baby want tosleep...

2015-10-07 18:13:04.541 协议代理引入[1893:303] 保姆正在哄婴儿睡觉,婴儿活力:20