版权声明:本文为博主原创文章,未经博主允许不得转载。

协议(protocol)是Objective-c中一个非常重要的语言特性,从概念上讲,非常类似于JAVA中接口. 一个协议其实就是一系列有关联的方法的集合(为方便后面叙述,我们把这个协议命名为myProtocol)。协议中的方法并不是由协议本身去实现,相反而 是由遵循这个协议的其他类来实现。换句话说,协议myProtocol只是完成对协议函数的声明而并不管这些协议函数的具体实现。

声明一个协议的语法非常简单:

[cpp] view plaincopy
  1. @protocol myProtocol <NSObject>
  2. @required
  3. -(void) protocolNameA:(NSString*)string;
  4. @optional
  5. -(void) protocolNameB:(NSString*)string;
  6. @end

第一行是声明这个协议的名字为myProtocol。尖括号中的NSObject本身也是一个协议,其中定义了很多基本的协议函数,比如 performSelector,isKindOfClass,respondsToSelector,conformsToProtocol,retain,release 等。

协议接口分为required和optional两类。required顾名思义是说遵守这个协议的那个类“必须要”实现的接口,而optional则是可以实现也可以不实现的。协议接口的定义和普通的函数定义是一样的。

最后一行@end表示协议定义结束。这个协议的定义通常是在.h文件中。

定义一个类遵循这个协议:

[cpp] view plaincopy
  1. @interface myClass  <myProtocol>
  2. @interface myClass :NSObject<myProtocol>
  3. @interface myClass :NSObject<myProtocol, NSCoding>

上 面分别是三种不同的情况。编译的时候编译器会自动检查myClass是否实现了myProtocol中的必要的(@required)接口。如果没有实现 则会发出一个警告信息。另外需要注意的是,如果有继承自myClass的子类,这些子类也是会自动遵循myClass所遵循的协议的,而且也可以重载这些 接口。

为什么需要协议?

苹果的官方文档指出三个原因:

  • To declare methods that others are expected to implement

  • To declare the interface to an object while concealing its class

  • To capture similarities among classes that are not hierarchically related

    其实还有第四个很重要的原因,那就是减少继承类的复杂性。一个经典的例子就是iOS UI框架里面的UITableViewController类。假如没有“协议”功能,用户就必须选择用继承和重载接口的方法来实现复杂的UI控制以及其 他事件的处理——这就对基类的设计提出了更大的挑战了。对于像这样一个table view,一个很好的实现方法就是采用协议,由协议里的接口来控制不同的数据源以及各种复杂的用户操作。UIKit中设计了两个很好的协议 UITableViewDelegate,UITableViewDataSource来实现UITableViewController的控制。任何遵 循这两个协议的类都可以实现对UITableView的控制。

    关于 id类型的运用:(不喜欢钻牛角尖的朋友,可以略过这一部分)

    id 类型在iOS中是一个通用类型,有点类似C语言的void*类型。编译器不能检查到定义为id类型的变量的实际类型,id类型的识别是发生在运行时阶段。 但是我们可以用 id<protocol_name> obj;这样的语法形式在编译阶段就可以让编译器知道obj只可以发送protocol_name中的消息,如果所发送的消息不在 protocol_name中,编译器会给一个警告信息“Instance method 'xxxx:' not found......”。这种情况多用于代理模式的实现,比如某一个类有一个delegate 的property:

    [cpp] view plaincopy
    1. id <myProtocol> delegate;

    这样,在编译阶段我们就可以知道用delegate所发送的消息是不是在它所遵循的myProtocol中的消息。好了, 到这里笔者钻起了牛角尖,我把id后面的 <myProtocol>删掉,然后用delegate发送一个并不存在于myProtocol中的消息,结果编译器还是给了“Instance method 'xxxx:' not found......”的警告信息。更奇怪的是,当发送一个存在于myProtocol中的消息时,编译器竟然没有这样的警告信息。这两个测试并不能说 明之前的解释是错误的,姑且认为id<myProtocol> delegate这种写法是为了便于知道这个delegate遵循了myProtocol的协议吧。

  • 本文若有任何错误,欢迎拍砖指正,谢谢!

转载于:https://www.cnblogs.com/Free-Thinker/p/4988888.html

Objective-C 协议(protocol)相关推荐

  1. Objective-C 入门(七)协议 protocol(JAVA中的接口)

    Objective-C 入门(七)协议 protocol(JAVA中的接口) 接口的作用想必大家都比较了解 OV中的 protocol 相比接口作用相似 语法稍有不同 1.先来看声明一个协议 在创建文 ...

  2. iOS进阶之协议Protocol(13)

    协议Protocol 协议Protocol 转载:https://www.jianshu.com/p/5178630d0fd1

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

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

  4. 协议实现objective C 协议的实现

    文章结束给大家来个程序员笑话:[M] 协议(protocal)与Java的interface(接口)和C++的纯虚类同相,协议只担任方法的列表,不担任方法的实现,的目是让别的类来实现,协议只有接口部份 ...

  5. swift:使用协议protocol设置颜色,UIImage的切圆角ImageWithCornerRadius

    //使用协议 方便以后切换颜色配置文件.或者做主题配色之类乱七八糟产品经理最爱的功能 protocol V2EXColorProtocol{ var v2_backgroundColor: UICol ...

  6. Swift 协议protocol

    /* 定义协议时候,协议后面最好跟上class delegate的属性最好用weak,用于防止循环引用 */ protocol BuyTicketDelegate : class{ func buyT ...

  7. Swift之深入解析协议Protocol的底层原理

    一.Swift 协议 ① 概念 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被称为遵循(conform)这个协议. 类,结构体或枚举类型都可以遵循协议,并提供具体实现 ...

  8. 【Swift学习笔记00】——enumeration枚举类型遵循协议protocol

    Apple官方文档:The Swift Programming Language Protocols and Extensions一节的小节练习,要求自行定义一个enumeration枚举类型,并且遵 ...

  9. Objective-C(八、正式协议Protocol,非正式协议informal protocol)——iOS开发基础

    结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 八.正式协议和非正式 ...

  10. Canal与Kafka数据传输协议protocol buffer

    1.写在前面 实时数仓开发中,利用Canal伪装slave获取MySQL的增量数据,获取后的数据由Kafka生产者接收,交由Flink实时流计算.传输数据量较大时,会占用内存及带宽,所以考虑将数据序列 ...

最新文章

  1. Android中利用服务来守护进程
  2. 生命周期 用户可以操作dom_React 生命周期的打怪升级之路
  3. 使用python来批量抓取网站图片
  4. JsonBuilder初出茅庐
  5. 水木告白工作室:Java从零入门之模仿头条资讯(一)
  6. [pytorch、学习] - 5.5 卷积神经网络(LeNet)
  7. vim安装时报错:Depends:vim-common (=2:7.4.1689-3ubuntu1.4) but 2:8.0.1453-1ubuntu1.1 is to be installed
  8. GDI+ 中发生一般性错误(在 OutputStream 中保存 PNG 格式图像时遇到的问题)
  9. 关于TTL大家容易忽略的地方
  10. SQL Server 板机
  11. 已解决:Cannot find ./catalina.sh The file is absent or does not have execute permission This file is ne
  12. Raki的读paper小记:Kernel Continual Learning
  13. android端使用mockServer
  14. python 循环高级用法 [expression for x in X [if condition] for y in Y [if condition] ... for n in N [if con
  15. 索辰科技回复首轮问询:2021年收入约2亿元,募投项目遭质疑
  16. Ubuntu安装搜狗fcitx无法正常安装的问题
  17. python字体类型arial_python-3.x - 为什么我的font.name属性不影响使用Python-pptx制作的ppt上的字体? 我总是得到arial字体 - 堆栈内存溢出...
  18. python音标1003python音标_python selenium 爬取百度翻译单词音标
  19. 2021年12月中国A股上市企业股价涨幅排行榜:三羊马涨幅最大,从事传媒行业的企业最多(附月榜TOP100详单)
  20. 刷屏的Google Pay:羊毛是你的,你是我的

热门文章

  1. 腾讯惹谁了?为什么用QQ邮箱投简历不受人待见
  2. Android使用XML全攻略(1)
  3. 使用开源软件 Mantis 实施缺陷跟踪的成功实践
  4. Qt5学习笔记之串口助手二:发送接收实现
  5. 深度学习(二)神经网络中的卷积和反卷积原理
  6. sdut 2878 圆圈
  7. XPath解析xml文件、html文件
  8. WIN7安装VS2008的 Error1935 问题解决方案
  9. individual program总结2.0
  10. 试用EF开发WEB应用程序(15): EF Servlet, or EFSP?