我们前面提到了OOP的继承,我们说Objective-C不像C++可以有多重继承,Objective-C是单一继承的,如果想要做到一个类别同时拥有多种型别的能力,我们就可以通过协议来实现。Objective-C中的协议就是java中的接口(interface),在Java中用”interface”这个关键字,在Objective-C则是用”@protocol”。(要特别注意不要把interface跟protocol搞混了,在Objective-C的interface等于java的class,而protocol则是相当于java中的interface).

定义Protocol很简单,在声明文件(h文件)中通过关键字@protocol定义,然后给出Protocol的名称,方法列表,然后用@end表示Protocol结束。在@end指令结束之前定义的方法,都属于这个Protocol。

除非你是为特定的类编写协议,可以写在相关类的h文件中,否则可以单独放在一个h文件中.这里还有两个关键字,@required和@optional,表 示如果要实现这个协议,那么添加@required注解的方法是必须要实现的,添加@optional注解的方法则是可选的,这两个注解关键字是在 Objective-C 2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现。

Protocol本身是可以继承的,例如:

1
2
3
4
5
6
7
8
9
10
11
@protocolProtocolA
 
-(void)methodA;
 
@end
 
@protocolProtocolB<ProtocolA>
 
-(void)methodB;
 
@end

如果你要实现ProtocolB,那么methodA和methodB都需要实现。

与java相比,接口使用的关键字不一样,语法也不一样.在承诺实现、或采用某个协议的接口代码中,协议的名称要写在父类名称后边的一对尖括号里(<…>),实现多个协议则用逗号(,)分隔:

 分类也可以实现协议,说法如下:

协议不引用任何类,它是类无关的(classless),任何类都可以实现定义好的Protocol。如果我们想知道某个类是否实现了某个Protocol,可以使用conformsToProtocol进行判断,如下:比如在使用optional类型的protocal时就需要使用这种方法来判断的确有执行这个方法

1
if([obj conformsToProtocol:@protocol(ProtocolName)]==YES){}

这里使用@protocol指令用于获取一个协议名称,并产生一个Protocol对象,并作为conformsToProtocol:的参数.为了测试obj是否实现了协议中的某一个方法,可以编写以下代码:

1
2
3
if([obj respondsToSelector:@selector(methodName)]){
            [obj methodName];
  }

了解更多信息可以查看iOS Developer Library中关于Protocol的介绍:Working with Protocols

最新文章

  1. springmvc SSM shiro redis 后台框架 多数据源 代码生成器
  2. init shutdown reboot poweroff halt区别
  3. Seo标签权重
  4. android 处理302地址
  5. 初试 Matlab 之去除水印
  6. test Windows Live Writer
  7. c# 调用 CRFs应用程序
  8. toB的产品经理和toc产品经理区别
  9. PROCESS_YIELD()宏使用及过程分析&lt;contiki学习笔记之八&gt;
  10. Django视图与网址传参
  11. sql - union all
  12. 高德JAVA笔试题
  13. FreeMarker 小结
  14. css实现选项卡
  15. 关于SQLALCHEMY之(一)
  16. ArcGIS 网络分析[8.6] 资料6 创建网络分析图层及进行路径分析
  17. Windchill基本业务对象-文档
  18. Ubuntu 15.10 下Scala 操作Redis Cluster
  19. 通过java实现解压zip,rar的代码
  20. SpringMVC 允许跨域访问 也可以选择限制指定IP 允许访问 对象的数据传输

热门文章

  1. poj--1064
  2. MVC如何在解决方案下创建文件夹
  3. Windows下新建多级文件夹
  4. Zend Framework 2中如何使用Service Manager
  5. Selenium WebDriver- 操作JavaScript的confirm弹窗
  6. spark作业
  7. JavaScript 专题系列第六篇,讲解深浅拷贝的技巧和以及实现深浅拷贝的思路
  8. [错误处理]UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xe5 in position 0: ordinal not in range(128)
  9. sqlserver的left join优化
  10. C#发送邮件异常,返回信息乱码