在ViewContrller文件里
#import "ViewController.h"
#import "Student.h"
#import "Waiter.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/*
我们之前讲过非正式协议(NSObject的类目),那么肯定还有正式协议
在OC中,一个类可以实现多个协议,通过多个协议可以弥补单继承的缺点,但是协议跟继承不一样,协议只是一个方法的列表,方法的实现得靠遵循该协议的类去完成.
协议:协议是一套标准,这个标准里面声明了很多方法,但是不关心具体这些方法是怎么实现的,具体的实现是由遵循这个协议的类去完成的.
*/
Student *student = [Student new];
Waiter *waiter = [Waiter new];
if ([waiter conformsToProtocol:@protocol(FoodProtocol)])
{
NSLog(@"waiter conforms FoodProtocol");
}
student.delegate = waiter; //等于[waiter sendFool:YES]
student.flag = YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
在Student.h文件里
#import <Foundation/Foundation.h>
//协议(正式协议) 用@protocol来定义
@protocol FoodProtocol <NSObject>
/*
在方法声明时,可以有两个关键字去限制是否必须让遵循该协议的类去实现此方法.
@required 标注的方法为必须实现的
@optional 标注的方法可以选择实现
*/
@required
-(void)sendFool:(BOOL)flag;
@optional
-(void)sayHello;
@end
@interface Student : NSObject
@property(nonatomic,assign)BOOL flag;
//声明一个必须实现协议的对象,用assign为了防止循环使用
@property(nonatomic,assign)id<FoodProtocol>delegate;
@end
在Student.h文件里
#import "Student.h"
@implementation Student
//flag的设置器
-(void)setFlag:(BOOL)flag
{
_flag = flag;
//self.delegate 判断代理是否存在
//- (BOOL)conformsToProtocol:(Protocol *)aProtocol; 它确定一个对象是否实现了某个协议
if (self.delegate && [self.delegate conformsToProtocol:@protocol(FoodProtocol)])
{
[self.delegate sendFool:_flag];
}
else
{
NSLog(@"代理不存在");
}
}
@end
在Waiter.h文件里
#import <Foundation/Foundation.h>
#import "Student.h"
//类实现协议的方法
@interface Waiter : NSObject<FoodProtocol>
@end
在Waiter.m文件里
#import "Waiter.h"
@implementation Waiter
-(void)sendFool:(BOOL)flag
{
if (flag)
{
NSLog(@"学员忙,我们送餐");
}
else
{
NSLog(@"学员不忙,我不送餐");
}
}
@end