一.协议的定义: 函数
@protocol 协议名 <NSObject>atom
//协议方法的声明 是对象方法spa
二.协议的使用:.net
1.遵循一个协议 类名:NSObject <协议名>3d
2.遵循多个协议 类名:NSObject <协议名1,协议名2>代理
3.类没有遵照协议 可是用下面方法能够使对象遵照协议 也能够实现协议中方法orm
Dog<myProtocol> *dog = [[Dog alloc]init];对象
4.判断对象是否有没有协议中方法的实现get
if ([dog respondsToSelector:@selector(say)])it
{
[dog say];
}
5.协议中只能用@property去使用set和get方法 不能设置成员变量
三.协议中方法的实现 在遵循协议的类的.m文件中实现
四.代理模式
给须要代理的类设置一个代理属性 要在类的头文件中导入协议的头文件
@property(nonatomic,strong) id <cureDelegate> delegate;
被代理的类遵照协议
@interface Doctor : NSObject<cureDelegate>
被代理的类实现协议中定义的方法
在须要代理的类的.m文件中利用设置的代理属性调用协议中的方法完成代理过程
[self.delegate cure];
主函数中要给须要代理的类设置代理对象
sicker.delegate = doctor;
须要代理的类的对象调用本身的方法
协议的具体实例
医生遵照一份协议给病人治病
cureDelegate.h
@protocol cureDelegate <NSObject>
//定义一个治病的方法在协议里
-(void) cure;
@end
sicker.h
#import <Foundation/Foundation.h>
#import "CureDelegate.h"
@interface Sicker : NSObject
@property(nonatomic,strong) NSString *sickerName;
//给病人设置一个代理属性 是id类型 可是前提是该类型要遵循代理的协议
@property(nonatomic,strong) id <cureDelegate> delegate;
//病人的生病方法
-(void)ill;
@end
sicker.m
#import "Sicker.h"
@implementation Sicker
//病人生病方法的实现
-(void)ill
{
NSLog(@"%@生病了",_sickerName);
//调用代理对象中的治病方法
[self.delegate cure];
}
@end
Doctor.h
#import <Foundation/Foundation.h>
#import "CureDelegate.h"
//doctor遵循治病协议给病人治病
@interface Doctor : NSObject<cureDelegate>
@property(nonatomic,strong) NSString *doctorName;
@end
Doctor.m
#import "Doctor.h"
@implementation Doctor
//doctor实现协议中治病的方法
-(void)cure
{
NSLog(@"%@医生把病看好了",_doctorName);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Doctor.h"
#import "Sicker.h"
int main(int argc, const char * argv[]) {
//实例化doctor对象
Doctor *doctor = [[Doctor alloc]init];
doctor.doctorName = @"李明";
//实例化sicker对象
Sicker *sicker = [[Sicker alloc]init];
sicker.sickerName = @"小王";
//给病人设置代理
sicker.delegate = doctor;
//调用病人生病方法
[sicker ill];
代理模式的具体实例
小王想要追花花 不用好意思 所以让小张帮忙给花花送花和巧克力
Protocol.h
//定义一份协议
@protocol myPotocol <NSObject>
//在协议中声明送花和送巧克力的方法
-(void)sendFlower;
-(void)sendChocolate;
@end
PersonI.h
#import <Foundation/Foundation.h>
#import "protocol.h"
#import "PersonII.h"
@interface PersonI : NSObject
@property(nonatomic,strong) NSString *name;
@property(nonatomic,strong) PersonII *person;
//小王中有一个遵照协议的代理对象
@property(nonatomic,strong) id<myPotocol> delegate;
-(void)chaseXiaohua;
@end
PersonI.m
@implementation PersonI
-(void)chaseXiaohua
{
NSLog(@"%@要追小花,请%@帮他",_name,[self valueForKeyPath:@"person.name"]);
//小王经过代理调用协议中的方法
[self.delegate sendFlower];
[self.delegate sendChocolate];
}
PersonII.h
#import <Foundation/Foundation.h>
#import "protocol.h"
//小张遵照协议
@interface PersonII : NSObject<myPotocol>
@property(nonatomic,strong) NSString *name;
@end
PersonII.m
#import "PersonII.h"
@implementation PersonII
//小张遵照了协议 因此小张实现协议中方法
-(void)sendFlower
{
NSLog(@"%@给小花送花",_name);
}
-(void)sendChocolate
{
NSLog(@"%@给小花送巧克力",_name);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "PersonI.h"
#import "PersonII.h"
int main(int argc, const char * argv[]) {
//实例化小王对象
PersonI *xiaowang = [[PersonI alloc]init];
xiaowang.name = @"小王";
//实例化小张对象
PersonII *xiaozhang = [[PersonII alloc]init];
xiaozhang.name = @"小张";
//给小王设置代理对象 对象是小张
xiaowang.delegate = xiaozhang;
//给小王设置person对象 是小张 目的是在小王的文件中经过KVC拿到小张的名字
xiaowang.person = xiaozhang;
//小王调用本身的方法
[xiaowang chaseXiaohua];
return 0;
}