一.協議的定義: 函數
@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;
}