OC中的协议(@protocol)

我们之前讲过非正式协议(NSObject的类目),那么肯定还有正式协议。在OC中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷。但是协议跟继承不一样,协议只是一个方法的列表,方法的实现得靠遵循该协议的类去完成。

 **协议:协议是一套标准,这个标准里面声明了很多方法,但是不关心具体这些方法是怎么实现的,具体的实现是由遵循这个协议的类去完成的。**

和非正式协议一样,正式协议是一些方法的列表,合肥正式协议不同的是,采用正式协议需要在声明类的时候说明要采用的协议。使用协议的办法是在类的@interface声明中列出协议的名称。这时,这个类就遵循了协议的内容,采用协议的话,就要让这个类实现该协议里所声明的方法。否则,编译器就会发出警告。

下面通过一个例子类说明协议的用法。
创建一个 Student 类和 Waiter 类,在 Student 类中声明一个协议,该协议包含一个方法 -(void) sendFood:(BOOL)flag;,让 Waiter 类遵循该协议。

//协议  正式协议
//定义一个协议
@protocol FoodProtocol <NSObject>

/*
 在方法声明的时候,可以有两个关键字去限制是否让遵循该协议的类去实现此方法
 @required   标注的方法为必须实现的方法(默认)
 @option     标注的方法为可选实现的

 */


@optional
- (void)sayHello;

@required
- (void)sendFood:(BOOL)flag;

@end


@interface Student : NSObject

@property (nonatomic,assign)BOOL flag;//学生状态,忙或者不忙

//声明了一个必须实现协议的对象,使用assign或者weak,为了防止循环引用
@property (nonatomic,assign)id<FoodProtocol>delegate;//声明了一个遵循FoodProtocol协议的代理

@end

Student.m文件

@implementation Student

- (void)setFlag:(BOOL)flag{

    _flag = flag;
    //判断代理是否存在及是否遵循协议,如果符合条件,则执行if里的代码   conformsToProtocol:确定了一个对象是否实现了某个协议
    if (self.delegate && [self.delegate conformsToProtocol:@protocol(FoodProtocol)]) {
        [self.delegate sendFood:flag];//self.delegate是什么??->代理

    }
    else{
        NSLog(@"代理不存在");
    }

Waiter类遵循该协议

//去.m文件实现协议里的方法   <FoodProtocol>表示遵循协议
@interface Waiter : NSObject<FoodProtocol>

Waiter.m文件

@implementation Waiter

//哪个类遵循协议就由哪个类去实现协议里的方法
- (void)sendFood:(BOOL)flag{

    if (flag) {
        NSLog(@"学生忙,我给你送外卖");
    }
    else{
        NSLog(@"学生不忙,你自己过来拿");
    }
}

主函数中

Student *student = [Student new];
    Waiter *waiter = [Waiter new];
    student.delegate = waiter;
    student.flag = YES;

运行结果为

2016-08-17 12:13:31.808 OC_09_02[1262:79013] 学生忙,我给你送外卖

还可以有另外一种声明协议的方式,即新建一个.h协议文件

#import <Foundation/Foundation.h>

//只是一个协议,不关心哪个类去实现
@protocol FoodProtocolSecond <NSObject>

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值