在OC基础(十一)中我们讨论了类别和非正式协议的奇异之处。在使用非正式协议时。能够仅仅实现你想要获得响应的方法。也不必在对象中声明不论什么内容来表示该对象可用作托付对象。

全部这些任务能够用最少的代码完毕。

以下来学习正式协议。

1. 正式协议

与非正式协议一样。正式协议包括了方法和属性的有名称列表。

但与非正式协议不同的是,正式协议须要显示地採用。採用(adopt)协议的办法是在类的@interface声明中列出协议的名称。採用协议后,你的类就要遵守该协议。採用协议就意味着你承诺实现该协议的全部方法。否则,编译器会生成警告来提醒你。

1.1 声明协议

声明一个协议的方法很easy:
@protocol myProtocol <NSObject>@required
-(void)protocolMethodA:(NSString *)string;
@optional
-(void)protocolMethodB:(NSString *)string;
@end

说明:
(1)第一行是声明这个协议的名字为myProtocol。尖括号里的NSObject本身也是一个协议,当中定义了非常多主要的协议函数。比方performSelector。isKindOfClass,respondsToSelector,conformsToProtocol,retain,release等。
(2)协议接口分为required和optional两类。required顾名思义是说遵守这个协议的那个类“必需要”实现的接口,而optional则是能够实现也能够不实现的。协议接口的定义和普通的函数定义是一样的。
(3)最后一行@end表示协议定义结束。这个协议的定义一般是在.h文件里。

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

@interface myClass <myProtocol>
@intrerface myClass : NSObject <myProtocol>
@interface myClass : NSObject <myProtocol, NSCoding>

说明:
上面各自是三种不同的情况。编译的时候编译器会自己主动检查myClass是否实现了myProtocol中的必要的(@required)接口。假设没有实现则会发出一个警告信息。另外须要注意的是,假设有继承自myClass的子类,这些子类也是会自己主动遵循myClass所遵循的协议的。并且也能够重载这些接口。

2.为什么要使用正式协议

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

  • 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的控制。

3.关于id类型的运用

     id 类型在iOS中是一个通用类型,有点类似C语言的void*类型。编译器不能检查到定义为id类型的变量的实际类型,id类型的识别是发生在执行时阶段。可是我们能够用 id<protocol_name> obj;这种语法形式在编译阶段就能够让编译器知道obj仅仅能够发送protocol_name中的消息,假设所发送的消息不在protocol_name中,编译器会给一个警告信息“Instance method 'xxxx:' not found......”。

这样的情况多用于代理模式的实现。比方某一个类有一个delegate 的property:

id <myProtocol> delegate;

     这样。在编译阶段我们就能够知道用delegate所发送的消息是不是在它所遵循的myProtocol中的消息。好了。 到这里笔者钻起了牛角尖,我把id后面的 <myProtocol>删掉。然后用delegate发送一个并不存在于myProtocol中的消息。结果编译器还是给了“Instance method 'xxxx:' not found......”的警告信息。

更奇怪的是,当发送一个存在于myProtocol中的消息时,编译器居然没有这种警告信息。这两个測试并不能说明之前的解释是错误的,姑且觉得id<myProtocol> delegate这种写法是为了便于知道这个delegate遵循了myProtocol的协议吧

OC基础回想(十二)协议相关推荐

  1. 计算机基础函数运用,计算机应用基础第十二讲:EXCEL中函数的实际运用.doc

    文档介绍: 计算机应用基础第十二讲:EXCEL中函数的实际运用.doc计算机应用基础第十二讲:EXCEL中函数的实际运用课 题EXCEL屮函数的实际运用课型多媒体课授课时间第20周教学目的实例分析,掌 ...

  2. python基础(十二):字符字节编码解码

    基础(十二) 字符串概述 类型 编码架构 字符串存储 常用字符编码 ASCII latin-1 UTF-8(通用性更好) UTF-16 UTF-32 内置函数 ord() chr() str.enco ...

  3. 想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(十 二)

    大家好,我是阿Ken.很快就要整理完第三章了~ 对于专升本_计算机文化基础我已经在博客里整理了已经一半多了,希望能够在我整理后能够帮助其他的小伙伴,这月底整理完所有的专升本_计算机文化基础的笔记,感兴 ...

  4. WiFi(Wireless Fidelity)基础(十二)

    目录 一.基本介绍(Introduction) 二.进化发展(Evolution) 三.PHY帧((PHY Frame ) 四.MAC帧(MAC Frame ) 五.协议(Protocol) 六.安全 ...

  5. JavaSE基础笔记十二

    第十一章 多线程 理解程序.进程.线程的概念 程序可以理解为静态的代码. 进程可以理解为执行中的程序. 线程可以理解为进程的近一步细分,程序的一条执行路径. 2.如何创建java程序的进程(重点) 方 ...

  6. Go语言基础(十二):并发编程

    文章目录 一.前言 二.goroutine 1.使用goroutine 2.启动goroutine示例 3.main优雅谢幕(sync.WaitGroup) 三.goroutine与线程 1.可增长的 ...

  7. RHEL6基础四十二之RHEL文件共享①NFS

    NFS(Network File System的缩写,即网络文件系统),依赖于RPC协议 (Remote Procedure Cal的缩写,即远程过程调用) 实现文件或信息传送,只要用到NFS的地方都 ...

  8. 网络安全基础(十二)

    1.什么叫证书链? 正确答案: 答:证书链由不同证书颁发机构(CA)创建的证书序列组成,其中每个连续的证书都是由一个CA颁发的证书,用于证明链中下一个CA的公钥. 2.怎样撤销X.509证书? 正确答 ...

  9. MFC入门基础(十二)控件 CScrollBar的使用

    1.参考博客: VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)-软件开发-鸡啄米 以下内容是参考上述博客大神的稍作修改 2. 首先还是创建一个基于对话框的MFC工程 ...

最新文章

  1. Linux高负载下优化MYSQL(一)
  2. ldconfig与 /etc/ld.so.conf
  3. jni java共享变量_Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量
  4. 技术玩法大升级,网易MCtalk揭秘5G即时通讯技术背后的秘密
  5. idea2018.3.5集成scala开发环境
  6. java 释放指针_C库释放来自Rust的指针
  7. 比乐高还要好玩,50种奇妙装置玩法,将STEM教育一网打尽
  8. Kotlin学习笔记21 协程part1 基本概念
  9. stm32f103c8t6最小系统电路原理图_嵌入式单片机之STM32F103C8T6最小系统板电路设计参考...
  10. window下安装好postgreSQL 9.3用cmd命令进入数据库(搞的我这个菜鸟只剩半条命)...
  11. [每日一题] OCP1z0-047 :2013-07-12 多表插入
  12. php框架原理 php初识,初识PHP
  13. 从随机数生成到随机采样的C++实现
  14. oracle启动数据库错误
  15. java 8 sdk官方下载_Java SDK下载方法
  16. 2022年申请亳州市发明专利材料,专利说明书摘要写作技巧
  17. 数字ic设计——SPI
  18. Cors跨域(一):深入理解跨域请求概念及其根因
  19. 在go mod中使用k8s.io/code-generator生成代码
  20. 从这 5 个场景 , 看 MPC 多方安全计算的行业应用

热门文章

  1. 非常详细的测试unity与android之间的通讯操作
  2. 一帖搞定U盘系统制作及安装苹果mac os引导U盘安装windows7
  3. “变态级”系统管理员笔试题,你能拿下吗?
  4. rancher中级(二)(rancher中添加证书及操作虚拟主机)
  5. 那些不能错过的Xcode插件
  6. UVa 10055 - Hashmat the Brave Warrior
  7. 一天一个shell实例(3)定时备份文件(转)
  8. MySQL 5.5 的COMPRESSED INNODB 表
  9. C#方法参数传递-同时使用ref和out关键字
  10. 技术转载:八款开源 Android 游戏引擎 (巨好的资源)