一、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