1 - 什么是协议?
一些方法的声明,一般写到一个.h的头文件中
方法有两种:
1) 必须实现 (@required 修饰 )
2) 选择实现(可以不实现) (@optional 修饰 )
2 - 协议的作用:
供其他的类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法
3 - 如何定义一个协议:
@protocol xxx <NSObject> 默认情况下遵守 NSObject协议
@end
4 - 类遵守协议的格式:
1) 遵守一个协议:
先导入头文件
@interface 类名 :NSObject <xxx>
@end
2) 遵守多个协议
@interface 类名 :NSObject <xxx,aaa,bbb>
@end
例子:
@protocol AnimalProtocol <NSObject> //默认情况下遵守NSObject
遵守协议的步骤:
1)导入头文件 (导入协议)
2)遵守协议
3)实现协议中方法
protocol的使用注意
protocol就一个用途,用来声明一大堆的方法(不能声明成员变量),不能实现.
1)一个协议,可以遵守其他的协议
2)一个类可以遵守多个协议
3)一个协议可以被多个类遵守
protocol基协议:
1>NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
2>其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
3>NSObject协议中声明很多最基本的方法,比如description、retain、release等
4>建议每个新的协议都要遵守NSObject协议
5>定义变量时指定协议
@required 和 @optional 都是协议中的关键字
@required 修饰的方法是必须要实现的
@required //默认情况下都是必须要实现的
@optional 修饰的方法是可以实现,也可以不实现的
protocol类型限制
id和instancetype都可以用来作为函数返回值
id可以用来定义变量,instancetype不能,instancetype可以准确区分类型
protocol代理设计模式
一些注意的地方
1.就是用来声明一大堆方法,且,只能声明方法,变量不行
2.凡是遵守了这个协议,就相当于拥有了这个协议的所有方法
3.父类遵守了某个协议,子类自动也遵守
4.公共方法可以抽取为协议,用来实习复杂设计模式
5.协议不一定非要定义在单独文件中,也可以直接写在某个类的.h文件中。规则:
当某个协议只是为了给某个类单独去遵守,就可以写在类里面,否则写在单独文件中。
// 有一个Baby类,有Cry行为(方法,意为“哭”),Baby可以配一个保姆,但是作为保姆,必须遵守保姆协议:能够处理Baby类Cry的行为。请根据以上描述设计一套代理设计模式(Objective-C)
main.m
#import <Foundation/Foundation.h>
#import "BaoMu.h"
#import "Baby.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
BaoMu *baomu = [BaoMu new];
Baby *baby = [Baby new];
baby.blood = 30;
baby.sleep = 20;
baby.bm = baomu;
[baby wantEat];
[baby wantSleep];
NSLog(@"%.2f,%.2f",baby.blood,baby.sleep);
}
return 0;
}
// Baby.h
#import <Foundation/Foundation.h>
@class BaoMu;
#import "lookBabyProtocol.h"
@interface Baby : NSObject
@property (nonatomic,assign) float blood;
@property (nonatomic,assign) float sleep;
//保姆、体力值、睡眠值
@property (nonatomic,strong) BaoMu<lookBabyProtocol> *bm;
-(void)wantEat;
-(void)wantSleep;
@end
// Baby.m
#import "Baby.h"
#import "BaoMu.h"
@implementation Baby
-(void)wantEat{
NSLog(@"婴儿在哭...");
//保姆要喂它吃
[self.bm feedBabyEat:self];
}
-(void)wantSleep{
NSLog(@"婴儿在哭...");
//保姆哄婴儿睡觉
[self.bm HongBabySleep:self];
}
@end
// Baomu.h
#import <Foundation/Foundation.h>
//保姆想成为baby的代理人,就必须遵守lookBabyProtocol协议
#import "lookBabyProtocol.h"
@interface BaoMu : NSObject<lookBabyProtocol>
@end
// 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
// lookBabyProtocol.h
#import <Foundation/Foundation.h>
@class Baby;
@protocol lookBabyProtocol <NSObject>
//喂婴儿吃饭
-(void)feedBabyEat:(Baby *)baby;
//哄婴儿睡觉:(Baby *)baby
-(void)HongBabySleep:(Baby *)baby;
@end