protocel协议概念及作用:声明一些必须实现和选择实现的方法
使用流程:
1.定义只生成一个.h文件
@protocol base <NSObject>
@end
2.采纳
类采纳协议
@interface Person : NSObject<base>
@end
3.实现协议中的方法
在类的.m中实现协议声明的方法
所有的协议都是采纳nsobject
一个协议可以采纳另一个协议
类和协议可以采纳多个协议<协议1,协议2,协议3...>
protocol使用注意:仅用来声明方法,谁采纳谁实现方法
只要父类遵守了协议,子类也遵守
oc不能继承多个类,但是能遵守多个协议(单继承,多采纳)
@protocol的两个关键字
@required 必须实现
@optional 选择实现
protocol代理设计模式:传入的对象代替当前类完成了某个功能,称为代理模式:
1.定义协议,声明方法
2.创建代理类,遵守上面的代理协议
3.在需要代理的类中,定义一个对象,类型为id且遵守代理协议的
4.在代理类中调用对象,调用代理类的方法
5.在main.m中实现
#import <Foundation/Foundation.h>
#import "agreement.h"
#import "Baby.h"
#import "Nanny.h"
#import "PlayWithBaby.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Baby *baby=[Baby new];
Nanny *nany=[Nanny new];
baby.houseMaid=nany;
[baby eat];
[baby play];
}
return 0;
}
#import <Foundation/Foundation.h>
#import "agreement.h"//导入协议
#import "PlayWithBaby.h"
@interface Baby : NSObject
@property(nonatomic,strong)id<agreement,PlayWithBaby> houseMaid;//婴儿中有个保姆的属性
-(void)eat;//婴儿自己的行为
-(void)play;
@end
#import "Baby.h"
@implementation Baby
-(void)eat{
NSLog(@"I'm a baby,and i'm hungry!");
[self.houseMaid feedBaby];//调用保姆照料的方法
}
-(void)play{
NSLog(@"I want to play");
[self.houseMaid PlayWithBaby];
}
@end
#import <Foundation/Foundation.h>
#import "agreement.h"
#import "PlayWithBaby.h"
@interface Nanny : NSObject<agreement,PlayWithBaby>//照料小孩者应采纳协议,即遵守协议,可以采纳多个协议
@end
#import "Nanny.h"
@implementation Nanny
-(void)feedBaby{
NSLog(@"I'm a domestic help,and i can take care of baby professionally!Yes,i'm feeding");//在保姆的.m文件中实现方法
}
-(void)PlayWithBaby{
NSLog(@"Baby have finished ,i'm playing with him");
}
@end
#import <Foundation/Foundation.h>
@protocol agreement <NSObject>
-(void)feedBaby;//在协议中声明方法,相当于合同中的条款
@end
#import <Foundation/Foundation.h>
#import "agreement.h"
@protocol PlayWithBaby <agreement>//一个协议可以采纳另一个协议
-(void)PlayWithBaby;
@end