协议

协议用于声明一些方法,这些方法有其他任何(遵循协议的)类来实现。它主要用于一下三种情形:

1.声明一些其他类期望实现的方法;

2.为需要隐藏自身的对象定义接口;

3.在没有继承相关性的对象之间抽象出相似性;

接口定义(用于其他类实现)

类和条目(category)的接口主要声明了一些方法,这些方法会在特定类实现文件中加以定义。相对而言,正式和非正式的协议,它们所声明得方法并不会针对特定的类,它是一种大众方法声明,任意一个或者多个类中都可以对这些方法加以实现。

从定义方法来说,协议就是一种简单的方法声明列表,不绑定任何类定义。例如,以下一些定义用户鼠标事件的方法可以汇集在一个协议中

- (void)mouseDown:(NSEvent *)theEvent;
- (void)mouseDragged:(NSEvent *)theEvent;
- (void)mouseUp:(NSEvent *)theEvent;

任意想要响应这些鼠标事件的类都可以遵循该协议并在自身类内部加以实现。

协议使得方法的声明不再依赖于特定类的层级关系,所以它的使用方式与类和条目(category)有很大的不同。协议只知道它包含的方法列表(可能)会在某些地方实现,但它并不关心具体在哪个类中实现。协议真正关心的是特定的类是否遵从并实现了类中声明的方法。因此对于对象的分类,不仅涉及类的继承关系,还有它们所遵循的协议。某些类即使它们属于不同的层级关系,但是它们所遵循的协议相同,它们也可以有共通点。

协议在面向对象的设计中扮演了很重要的角色,尤其是当一个项目要用到很多的实现体或者其他项目所开发的对象。cocoa软件中就大量的使用了协议来实现objective-c消息的内部通讯。

当然并不是所有的objective-c程序都必须使用协议。它是非强制的,不像类定义和发消息表达式。有些cocoa框架中使用了它们,有些没有。主要还是看手头的工作是否有必要。

其他类来实现方法

如果你对类定义有所了解的话,你可以看看其中的接口声明(还有子类的一些接口声明),从中你就可以找到这些对象响应哪些消息。这些声明向外部广播了它可以接受并响应的消息。而协议则提供了一种向外界广播它们要发送的消息的机制。
Communication works both ways; objects send messages as well as receive them. For example, an object might delegate responsibility for a certain operation to another object, or it may on occasion simply need to ask another object for information. In some cases, an object might be willing to notify other objects of its actions so that they can take whatever collateral measures might be required.
(通讯工作是双向的;对象不但接收消息,它们也发送消息。例如,一个对象可以将某些特定的操作委托给另外一个对象,或者可能只是简单的从另外一个对象上获取一些信息。也有一些情况下,一个对象可能希望把它自己的一些动作通知给其他对象以便其他对象进行相关的动作。)
如果你开发的项目中包含了发送者和接收者类(或者一些类已经提供了接收器和接口文件),通讯的过程很容易进行。消息发送者类只需要import必要接收者类的头文件。这些头文件中已经包含了接收者可接收的相关消息的声明。
但是如果你设计的对象所发送消息的接收者未定义时--这种情况下你就不会有接收者甚至相关声明头文件。在这种情况下,你就需要另外一种发送消息的声明方式而无需实现它们。协议整好满足了这种需求,它通知编译器它将要用到的方法,同时还通知其他类该如何实现这些方法来协同工作。
这个协助对象发送helpOut:举个具体的例子,假设你设计了某一个对象,该对象请求另外一个对象的协助,它就可以向这个协助对象发送helpOut:和一些其他消息。你在对象内部分配了一个assistant变量来保存接受这些消息的outlet并定义了相关的set方法。其他对象都可以通过该set方法来注册并成为这个消息的潜在接收者。
- setAssistant:anObject
{
    assistant = anObject;
}
接着,当有消息要发送给assistant,就检测该变量是否可以响应该消息,并响应,代码如下:
- (BOOL)doWork
{
    ...
    if ( [assistant respondsToSelector:@selector(helpOut:)] ) {
        [assistant helpOut:self];
        return YES;
    }
    return NO;
}
因为在你写这段代码的时候,你并不知道assistant变量里存储的是什么对象,所以你只能定义一个helpOut: 的协议方法,这种情况下,你根本无法import相关的声明文件。

为匿名对象声明接口

协议还可以用于匿名对象的方法声明, 所谓匿名对象就是未知类型的对象。

protocols 协议相关推荐

  1. 【Xamarin笔记】Events, Protocols and Delegates

    Events, Protocols and Delegates   事件.协议和委托 This article presents the key iOS technologies used to re ...

  2. wss协议 c 服务器,利用LIBWEBSOCKETS写WS、WSS服务端和客户端

    libwebsockets是一款轻量级用来开发服务器和客户端的C库.按照官方(https://libwebsockets.org/)给出的介绍来看,它不仅支持ws,wss还同时支持http与https ...

  3. https.protocols的检测与设置

    最近在做一个需求,用到了https进行接口交互,在测试环境报如下错: 10:20:21,667 ERROR [stderr](http-executor-threads - 39) java.lang ...

  4. 彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想

    OkHttp 现在统治了Android的网络请求领域,最常用的框架是:Retrofit+okhttp.OkHttp的实现原理和设计思想是必须要了解的,读懂和理解流行的框架也是程序员进阶的必经之路,代码 ...

  5. Springboot swagger2教程

    swagger2教程 swagger,中文"拽"的意思.它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试.另外swagger很容 ...

  6. fmpeg 编译编码 _libx264和librtmp

    window下通过msys2编译libx264.lib msys2的下载地址为:http://www.msys2.org/ 首先下载msys2并安装软件,安装时可以选择安装路径,我选择的是安装目录为: ...

  7. php web目录结构,目录结构

    目录结构 Workerman // workerman内核代码 ├── Connection // socket连接相关 │ ├── ConnectionInterface.php// socket连 ...

  8. oc runtime

    观 :http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/  的总结: 1.调用方法的本质: [receiver message] ...

  9. Java URL处理

    URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址.表示为互联网上的资源,如网页或者FTP地址. 本章节我们将介绍Java是如处理URL的.URL ...

最新文章

  1. Oracle笔记 四、增删改、事务
  2. Sklearn的train_test_split用法
  3. ubutnu16.04搭建LAMP环境(搭建wordpress博客)
  4. 重磅!2021 高通人工智能应用创新大赛今日开赛
  5. Spring 加载、解析applicationContext.xml 流程
  6. 打开计算机后 无法最小化,最小化窗口后无法在任务栏中显示的三种解决方法...
  7. centos7离线安装oracle11g,CentOS 7.5离线安装Oracle 11gR2
  8. 使用Cygwin实现vlc 1.0.5的wince移植
  9. Spring Boot异常处理
  10. Python+OpenGL使用Cohen-Sutherland算法实现直线裁剪
  11. Java基础学习总结(78)——Java main方法深入研究学习
  12. PyTorch 功能欠缺,Meta 推出 TorchRec 来补救?
  13. 本地html如何导出pdf,html表格以pdf格式导出到本地
  14. Linux中的三个特殊文件
  15. Linux系统调用接口添加简单示例
  16. 同花顺股票交易接口怎样执行量化挂单策略?
  17. 用html设计logo,终于知道网页logo设计要点
  18. k8s停止服务_Kubernetes 优雅停止Pod
  19. Android 仿微信全局字体大小调整
  20. 八位共阴数码管的工作方式

热门文章

  1. 讲计算机讲座开场白,讲座主持词开场白
  2. PC移植安卓---2018/04/26
  3. Flowable 数据库表结构 ACT_GE_BYTEARRAY
  4. Linux-帆软 服务器部署
  5. Linux下帆软报表部署
  6. 深度学习-Pytorch环境搭建(Windows)
  7. (错误都已改正)AS608指纹+STM32串口通信录入或删除指纹
  8. 小波函数的数据拟合方法
  9. 《怪诞行为学二》启发(一)
  10. 数字调制的形式:ASK PSK FSK DPSK原理框图