我们前面提到了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

Objective-C 协议(protocol)二的更多相关文章

  1. OC基础--分类(category) 和 协议(protocol)

    OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...

  2. Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考

    总结:继承.分类(Category.extension).协议(protocol)   一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...

  3. 协议(Protocol)与委托代理(Delegate)

    协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情, ...

  4. iOS阶段学习第19天笔记(协议-Protocol)

    iOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者      之间通讯的一种方式 2) ...

  5. 协议Protocol

    1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口.           遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议.       ...

  6. 浅谈iOS开发的协议(protocol)和代理(delegate)

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  7. 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

    关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...

  8. Objective-C中的协议(Protocol)和类别(Category)

    1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...

  9. HTTP协议(二)

    一.请求的格式: (一).请求行 (1).请求方法 1.GET 2.POST 3.PUT 4.DELETE 5.TRACE 6.OPTIONS (2).请求路径 (3).所用的协议 (二).请求头信息 ...

  10. 网络通信 --> 互联网协议(二)

    互联网协议(二) 一.对上一节的总结 我们已经知道,网络通信就是交换数据包.电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信.数据包的结构,基本上是下面这样: 发送 ...

随机推荐

  1. poj 1017 装箱子问题 贪心算法

    题意:有1*1到6*6的的东西,需要用6*6的箱子将它们装起来.问:至少需要多少个6*6箱子 思路: 一个瓶子怎么装东西最多?先装石头,在装沙子,然后装水. 同样放在本题就是先装6*6然后5*5... ...

  2. re--findall 【转】

    原文链接 python re 模块 findall 函数用法简述 代码示例: >>> import re >>> s = "adfad asdfasdf ...

  3. 爬取豆瓣Top250_Ajax动态页面

    爬取网址: 完整代码: import sys from urllib import request, parse import ssl ssl._create_default_https_contex ...

  4. Linux IP怎么设置

    最常用的给网卡配置ip的命令为#ifconfig eth0 192.168.0.1 但是,这样重启后又打回原形.要想永久保存,需要 vim /etc/sysconfig/network-scripts ...

  5. loadrunner参数化数据分配方法

    数据分配方法: 在“Select next row“列表中选择一个数据分配方法,以指示在Vuser脚本执行期间如何从参数文件中取得数据.选项包括”Sequential“.“Random”.“Uniqu ...

  6. Leetcode 466.统计重复个数

    统计重复个数 定义由 n 个连接的字符串 s 组成字符串 S,即 S = [s,n].例如,["abc", 3]="abcabcabc". 另一方面,如果我们可 ...

  7. [python学习篇][廖雪峰][2][高级函数] map 和reduce

    我们先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 举例说明,比如我们有一个函数f(x)=x2,要把这个函数 ...

  8. nyoj 题目2 括号配对问题

    描述 今天发现了nyoj,如获至宝.准备开刷. 括号配对问题 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的 ...

  9. PHP_命名空间

    namespace NS; define(__NAMESPACE__ .'\foo','111'); define('foo','222'); echo foo; // 111. echo \foo; ...

  10. 【bzoj4080】[Wf2014]Sensor Network 随机化

    题目描述 魔法炮来到了帝都,除了吃特色菜之外,还准备去尝一尝著名的北京烤鸭.帝都一共有n(1<=1<=100)个烤鸭店,可以看成是二维平面内的点.不过由于魔法炮在吃烤鸭之前没有带钱,所以吃 ...