Objective-C 协议(protocol)
版权声明:本文为博主原创文章,未经博主允许不得转载。
协议(protocol)是Objective-c中一个非常重要的语言特性,从概念上讲,非常类似于JAVA中接口. 一个协议其实就是一系列有关联的方法的集合(为方便后面叙述,我们把这个协议命名为myProtocol)。协议中的方法并不是由协议本身去实现,相反而 是由遵循这个协议的其他类来实现。换句话说,协议myProtocol只是完成对协议函数的声明而并不管这些协议函数的具体实现。
声明一个协议的语法非常简单:
- @protocol myProtocol <NSObject>
- @required
- -(void) protocolNameA:(NSString*)string;
- @optional
- -(void) protocolNameB:(NSString*)string;
- @end
第一行是声明这个协议的名字为myProtocol。尖括号中的NSObject本身也是一个协议,其中定义了很多基本的协议函数,比如 performSelector,isKindOfClass,respondsToSelector,conformsToProtocol,retain,release 等。
协议接口分为required和optional两类。required顾名思义是说遵守这个协议的那个类“必须要”实现的接口,而optional则是可以实现也可以不实现的。协议接口的定义和普通的函数定义是一样的。
最后一行@end表示协议定义结束。这个协议的定义通常是在.h文件中。
定义一个类遵循这个协议:
- @interface myClass <myProtocol>
- @interface myClass :NSObject<myProtocol>
- @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- 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)相关推荐
- Objective-C 入门(七)协议 protocol(JAVA中的接口)
Objective-C 入门(七)协议 protocol(JAVA中的接口) 接口的作用想必大家都比较了解 OV中的 protocol 相比接口作用相似 语法稍有不同 1.先来看声明一个协议 在创建文 ...
- iOS进阶之协议Protocol(13)
协议Protocol 协议Protocol 转载:https://www.jianshu.com/p/5178630d0fd1
- 协议(Protocol)与委托代理(Delegate)
协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情, ...
- 协议实现objective C 协议的实现
文章结束给大家来个程序员笑话:[M] 协议(protocal)与Java的interface(接口)和C++的纯虚类同相,协议只担任方法的列表,不担任方法的实现,的目是让别的类来实现,协议只有接口部份 ...
- swift:使用协议protocol设置颜色,UIImage的切圆角ImageWithCornerRadius
//使用协议 方便以后切换颜色配置文件.或者做主题配色之类乱七八糟产品经理最爱的功能 protocol V2EXColorProtocol{ var v2_backgroundColor: UICol ...
- Swift 协议protocol
/* 定义协议时候,协议后面最好跟上class delegate的属性最好用weak,用于防止循环引用 */ protocol BuyTicketDelegate : class{ func buyT ...
- Swift之深入解析协议Protocol的底层原理
一.Swift 协议 ① 概念 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被称为遵循(conform)这个协议. 类,结构体或枚举类型都可以遵循协议,并提供具体实现 ...
- 【Swift学习笔记00】——enumeration枚举类型遵循协议protocol
Apple官方文档:The Swift Programming Language Protocols and Extensions一节的小节练习,要求自行定义一个enumeration枚举类型,并且遵 ...
- Objective-C(八、正式协议Protocol,非正式协议informal protocol)——iOS开发基础
结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 八.正式协议和非正式 ...
- Canal与Kafka数据传输协议protocol buffer
1.写在前面 实时数仓开发中,利用Canal伪装slave获取MySQL的增量数据,获取后的数据由Kafka生产者接收,交由Flink实时流计算.传输数据量较大时,会占用内存及带宽,所以考虑将数据序列 ...
最新文章
- Android中利用服务来守护进程
- 生命周期 用户可以操作dom_React 生命周期的打怪升级之路
- 使用python来批量抓取网站图片
- JsonBuilder初出茅庐
- 水木告白工作室:Java从零入门之模仿头条资讯(一)
- [pytorch、学习] - 5.5 卷积神经网络(LeNet)
- vim安装时报错:Depends:vim-common (=2:7.4.1689-3ubuntu1.4) but 2:8.0.1453-1ubuntu1.1 is to be installed
- GDI+ 中发生一般性错误(在 OutputStream 中保存 PNG 格式图像时遇到的问题)
- 关于TTL大家容易忽略的地方
- SQL Server 板机
- 已解决:Cannot find ./catalina.sh The file is absent or does not have execute permission This file is ne
- Raki的读paper小记:Kernel Continual Learning
- android端使用mockServer
- python 循环高级用法 [expression for x in X [if condition] for y in Y [if condition] ... for n in N [if con
- 索辰科技回复首轮问询:2021年收入约2亿元,募投项目遭质疑
- Ubuntu安装搜狗fcitx无法正常安装的问题
- python字体类型arial_python-3.x - 为什么我的font.name属性不影响使用Python-pptx制作的ppt上的字体? 我总是得到arial字体 - 堆栈内存溢出...
- python音标1003python音标_python selenium 爬取百度翻译单词音标
- 2021年12月中国A股上市企业股价涨幅排行榜:三羊马涨幅最大,从事传媒行业的企业最多(附月榜TOP100详单)
- 刷屏的Google Pay:羊毛是你的,你是我的