OC中的协议(@protocol)
来源:互联网 发布:php mongodb连接池配置 编辑:程序博客网 时间:2024/06/12 00:26
我们之前讲过非正式协议(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
- OC中的协议(@protocol)
- OC中的协议protocol
- OC Protocol(协议)
- 17、OC 协议(protocol)
- OC之Protocol(协议)
- OC中的类别Category-协议Protocol-…
- OC------协议(Protocol) & 代理(Delegate)
- 黑马程序员--OC--Protocol(协议)
- 15、黑马程序员-OC Protocol(协议)
- OC之【@protocol协议】
- 7、协议protocol-OC
- 7、OC Protocol协议
- OC--block,@protocol协议
- oc的协议(protocol)
- OC之Protocol (协议)
- 7、OC Protocol协议
- OC协议protocol详解
- OC中protocol协议
- 解决for循环项问题
- CentOS 安装Python 3.52
- 矩阵求导公式
- c3p0-config.xml文件基本配置
- 三中方法教你一步一步导入一个eclipse项目到Intellij IDEA
- OC中的协议(@protocol)
- android 几个快速编译images指令
- 利用CSS和DIV的几种布局方法(3)
- 线程
- 解决 Successfully created project '' on GitHub, but initial push failed: Could not read from remote
- node -- 使用UEditor富文本编辑器
- C#入门9.3——面向对象概述
- 第二章 浏览器安全
- 流媒体开发 HLS草案