**以下内容中 interface 指代传统意义上的接口, 而@interface 指代 Objective-C 中的类型规范概念,以免混乱。

看到这一章,有点奇怪,其实只要将 protocal 当作 C# 里面的接口来认识就好了。

因为 Objective-C 给每个 Class 都分配了一个 @interface ,因此用这人概念来表达 interface 的意思。

抽象出接口的目的:

1. 相似方法组的实现有共同的规范。
2. 让“接口”独立于类。
3. 封装没有继承关系的类的共性。

if ( [assistant respondsToSelector:@selector(helpOut:)] ) {
    [assistant helpOut:self];
    return YES;
}
return NO;

上面的代码是不是可以认为使用”反射“确定了一个对象是否支持一个方法调用。

但是 protocal 比 interface 强大的地方在于,它是可以跨应用程序的,这也是之所以叫它 protocal 的原因。

事实上,将“方法调用”都转换为消息传递本身就是弱化了应用程序域的概念,让多个程序可以无缝地工作在一起,在这一点上苹果确实是很高明的。

匿名类也可以利用 protocal 来与外界沟通而无需定义与之对应的 @interface。

如何申明一个 protocal:
@protocol ProtocolName
method declarations
@end

需要注意,协议不象类名称一样全局可见,它只存于作用的命名空间中。

协议用的方法可以申明为 option 方式(可选/非强制方式)

非正式的协议使用 @interface 来申明,如:
@interface NSObject ( MyXMLSupport )
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end

与类对应的 @interface 不一样的是,非正式协议没有对应的实现文件,即只有一个空的协议在那里,可以认为它是用来标定一类有相似行为的类的分组方法。

非正式协议没有编译时的类型检查,如果需要类型检查,应该使用正式协议。

非正式协议常用于所有方法都是可选时的情形,但对于 OS X > 10.5 最好使用正式协议。

关于协议对象:

正式协议是一种特殊的数据类型:它闪是 Protocal 的实例而非一般对象是 Class 的实例。

运行时只初化有引用的 @protocal

关于采用一个协议;

不论正式或非正式协议都使用下面的语法来申明:
@interface ClassName : ItsSuperclass < protocol list >

使用多个协议的情况:
@interface Formatter : NSObject < Formatting, Prettifying >

使用协议的类需要 include 协议所在的 .h 文件,并且协议中的方法不义定义在 类型自己的@interface 中,这样来避免重复。

一个类可以没有对应的 @interface 而只有 protocal

可以使用下面的测试方法来检查一个对象是否遵守某个 protocal:
if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)]  )

如果只需要检查一个特定方法的话,尽量使用 respondsToSelector: test 从则避免检测 protocal 中的所有方法。

协议可以继承

由于协议可以互相引用, 因此在某些情况下不需要 import 协议所在的文件,而只需要象这样:
@protocol B;
@protocol A
- foo:(id <B>)anObject;
@end

转载于:https://www.cnblogs.com/darkangle/archive/2011/08/14/2138557.html

Objective-C 学习笔记 - part 4 - 协议相关推荐

  1. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  2. 【转】:TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute

    TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute 分类:            TCP/IP详解学习笔记计算机网络2006-04-20 18:147970人阅读评论(1)收 ...

  3. 网络协议学习笔记-IGMP协议

     网络协议学习笔记-IGMP协议 http://hi.baidu.com/clxye/item/3db870336d86c0c11a969614 IGMP协议(Internet Group Man ...

  4. FPGA学习笔记_UART串口协议_串口接收端设计

    FPGA学习笔记 1. UART串口协议以及串口接收端设计 1 原理图 2 Verilog 代码 3 Modelsim仿真 4. FPGA板级验证 1.1 串口协议接收端设计 目标:FPGA接收其他设 ...

  5. 以太网学习笔记1——主要协议及帧结构

    目录奉上,用者自取: 文章目录 1. 以太网主要协议关系介绍 2. 协议介绍及帧结构 2.1 媒体访问控制子层协议MAC 2.2 地址解析协议ARP 2.2.1ARP帧结构 2.2.2 ARP协议工作 ...

  6. 【安全牛学习笔记】DNS协议隧道、DNS协议隧道-dns2tcp

    DNS协议隧道 防火墙禁止TCP出站访问流量 - SSH隧道.端口准发全部失效 - 使用基于UPD协议的隧道 - DNS的工作原理适合用于实现隧道 DNS工作原理 - DNS隧道原理: 注册受自己控制 ...

  7. TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议

    把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数 ...

  8. TCP/IP详解学习笔记(9)-TCP协议概述

    终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读.前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西. TCP和UDP处在同一层---运输 ...

  9. TCP/IP详解--学习笔记(9)-TCP协议概述

    终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读.前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西. TCP和UDP处在同一层---运输 ...

  10. CAN学习笔记之15765-2协议摘要

    目录 一.概述 二.网络层协议 2.1 单帧 2.2 首帧 2.3 连续帧 2.4 流控帧 三.网络层服务项 一.概述 最初对15765-2的理解,就是定义了单帧.首帧.连续帧以及流控帧的格式.随着进 ...

最新文章

  1. Linux下DNS简单部署(主从域名服务器)
  2. SimpleDraw-Windows Phone7上的应用
  3. 远程协助TeamView软件 轻松控制计算机
  4. 我常用的eclipse快捷键
  5. 前端学习(2998):vue+element今日头条管理--element引入
  6. EDA技术使用教程实验
  7. 不定长内存池之apr_pool
  8. 通过负载均衡器+域名实现容灾切换-(8)基于DNS解析的GSLB在BS架构中应用实践(转)(2)...
  9. Python中ASCII码的数字和字符的转换
  10. Dubbo 没落了吗?
  11. windows系统挂载存储阵列的iscsi映射虚拟磁盘
  12. 串口通信USART的波特率误差计算GD32、STM32
  13. 统计通话次数和时间的软件_通话时间统计器下载-通话时间统计 安卓版v2.6-PC6安卓网...
  14. 尝试加载Crystal Reports 运行时时出错
  15. dcs world f15c教学_DCS小百科,工控人必须知道的一些小知识
  16. Activity的神奇启动模式之singleTask
  17. 无线网络技术(实验)——无线局域网组成与管理实验
  18. 如何使用 VSCode 开发 RT-Thread Smart 应用程序
  19. 如何指定火狐浏览器打开网页
  20. RevitAPI: 当前视图为透视图的时候IdlingEvent不会被触发

热门文章

  1. 多活主备选择性DNS解析(一个域名对应多个IP)
  2. 使用零信任思想构建的安全防御系统是什么样子的
  3. java ncso发送电邮_如何在Windows中从命令行发送电子邮件(无需额外的软件)
  4. 【二维线段树】20150209测试 千石抚子的三维积木
  5. 基于 keepalived 实现两台机器服务(主备)故障自动切换
  6. 分布式事务之——两段式、三段式
  7. 烟火里的尘埃 - 郁欢
  8. scott.sql脚本 mysql_数据库scott脚本
  9. parent.relativePath‘ of POM io.renren:renren-generator:1.0.0
  10. python爬虫跳过异常处理