一、什么是协议?

1.协议声明了可以被任何类实现的方法
2.协议不是类,它是定义了一个其他对象可以实现的接口
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5:委托,就是调用自己定义方法,别的类来实现。
另外:
可以用来声明一大堆方法(不能声明成员变量)
只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
只要父类遵守了某个协议,就相当于子类也遵守了

二、格式
@protocol 协议名称
// 方法声明列表
@end

某个类遵守某个协议

@interface 类名 : 父类 <协议名称>
@end

某个协议遵守某个或者某些协议,一个协议可以遵守其他多个协议,
多个协议之间用逗号 , 隔开。
@protocol 协议名称 <其他协议名称1, 其他协议名称2>@end

定义变量时,限制这个变量保存的对象遵守某个协议

类名<协议名称> *变量名;id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;

@property中声明的属性也可用做一个遵守协议的限制

@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;

三、协议里的关键字

协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,
用途在于程序员之间的交流
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@required
- (void)test;
- (void)test2;

@optional:这个方法不一定要实现

@optional
- (void)test3;

四、基协议

NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法,比如description、retain、release等
建议每个新的协议都要遵守NSObject协议

五、注意点:

协议可用定义在单独.h文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
分类可用定义在单独.h和.m文件中,也可用定义在原来类中
一般情况下,都是定义在单独文件
定义在原来类中的分类,只要求能看懂语法

  

转载于:https://www.cnblogs.com/kingBook/p/6703959.html

Object-c 协议@protocol(@required、@optional)相关推荐

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

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

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

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

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

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

  4. Expected required, optional, or repeated.错误解决方法

    Expected "required", "optional", or "repeated".错误解决方法 编译Protobuf 库,出现如 ...

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

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

  6. Swift 协议protocol

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

  7. Netty序列化协议Protocol buff

    序列化协议 序列化和反序列化 把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化.用途:文件的copy.网络数据的传输 Protocol buff(代替JSON) ...

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

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

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

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

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

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

最新文章

  1. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
  2. Dataset之Pascal:Pascal竞赛及其Pascal VOC(VOC 2012、VOC 2007) 数据集的简介、下载、使用方法详细攻略
  3. Java中使用UUID给图片命名的文件上传方法
  4. 一步一步自定义spinner
  5. java spark环境配置文件_JAVA, SCALA, HADOOP, SPARK里的JAVA_HOME和环境变量设置
  6. 关于castle和Could not find the dialect in the configuration错误
  7. oracle jinitiator 1.1.8.2,oracle jinitiator 1.1.8.2-Oracle Jinitiator1.1.8.27 3264位最新版下载_东坡手机下载...
  8. 个人收藏的flex特效网址【经典中的极品】
  9. CRC_8循环冗余校验码verilog实现
  10. 360 无法显示网速
  11. (一)基于Multisim的超外差接收系统:本地振荡器的设计
  12. 网吧无盘用华为服务器,50台主机网吧无盘服务器
  13. 英维克,上市只是一个新的起点
  14. typora字体设置颜色的解决方案
  15. JavaScript中的经典题型(类数组、CSS Sprites、事件委托、经典去重、原型链、闭包、深浅克隆、附带思路流程和源码)
  16. 服务器开机显示器没反应,老司机教你开机显示器没反应怎么办
  17. 68个经典励志小故事,让你终身受益[转]
  18. html 图片自动滚动播放,javascript+html5实现仿flash滚动播放图片的方法
  19. window 安装 deepin双系统 (thinkpad install deepin)
  20. CSS样式表引入的三种方式,及优先级顺序

热门文章

  1. MAMP Pro for Mac(PHP/MySQL开发环境)
  2. 如何在Pages for Mac中添加页眉、页脚和页码?
  3. C#3.0入门系列(八)-之GroupBy操作
  4. spring的设计模式
  5. 渐进式Web应用(PWA)入门教程(下)
  6. cisco接口模式转换
  7. 三星投8万亿扩充10nm、7nm产能:骁龙835爆发
  8. 百度前端技术学院-task1.8源代码以及个人总结
  9. Hibernate性能优化2( 转)
  10. 解决在DHCP环境下私自指定IP和私自搭建DHCP服务器的方法