在重温《OBJC编程基础》这本书时,对于非正式协议的感觉非常陌生,阅读了一篇王中周的博客,结合自己在书中阅读的内容,做一些总结。

一、非正式协议

显然这个名词是相对于正式协议而言的。在解释非正式协议之前,先引用两段话:

1、在《Cocoa设计模式》第六章类别的6.3.2把类别用于非正式协议一节中,这样写到:

非正式协议通常定义为NSObject的类别。类别接口中指定的方法可能会或者可能不会被框架类实际地实现。非正式协议位于一种设计灰区中。正式协议由编译器检查并且代表一种关于对象能力的保证,但是非正式协议不会做出保证----而只会给出提示

-----摘自王中周博客 原地址:http://blog.csdn.net/wzzvictory/article/details/9295317

可以看出,所谓的非正式协议不过就是NSObject的类别。所以其所有的子类都含蓄的接受了这个协议。而且要注意:非正式协议内的方法都是可选实现的。因此,在调用协议内的方式时,需要先检查对象是否实现了该方法。而且非正式协议是Foundation和AppKit类实现委托的唯一方式。

匿名类别(类拓展):

@interface ViewController (){// 匿名类别----类拓展float scH;// 增加实例变量
}- (void)setValue:(id)value forKey:(NSString *)key;// 增加方法

@property (nonatomic, strong) NSString *name;// 增加属性@end

这种写法的类别叫匿名类别,又叫类扩展,所谓的扩展,其实就是为一个类添加额外的原来没有的变量、方法或者合成属性。

类别:

@interface NSString (theNew)// 类别

@property (nonatomic, strong) NSString *name;- (void)setValue:(id)value forKey:(NSString *)key;@end

这种写法是类别,只能增加方法和属性,但是不能增加实例变量。

那么类别与匿名类别有什么区别呢?

①类别中只能增加方法;

②是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例变量默认是@private类型的(作用范围只能在自身类,而不是子类或其他地方);

③类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。

④类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。

⑤定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。

二:正式协议:

1.概念

与非正式协议一样,正式协议是包含了方法和属性的有名称列表,但与非正式协议不同的是正式协议要要求显式地采用。采用(adopt---私以为翻译为接受更好)协议的办法是在类@interface声明中列出协议的名称。采用协议后,你的类就要遵守该协议。采用协议就意味着你承诺实现改写的所有方法(应当是@required的方法)。

----摘自《OBJC编程基础》

2.正式协议存在的意义

从字面上理解,正式协议比非正式协议要正式了很多,它存在的意义在于:

正式协议可以将业务中的方法定义剥离出来,形成一个单独的文件,这跟传统OO中的提取接口是不谋而合的。如果遇到二个系统需要交换数据,可以制定一套双方都遵守的协议,然后这二个系统中都把这个协议文件添加到项目中,实现它即可。

3、继承性

正式协议和类一样,是可以继承的,书写格式同类继承相似:

@protocol NewProtocol <NSCopying>
- (void)setName:(NSString *)name;
@end

转载于:https://www.cnblogs.com/BJTUzhengli/p/5178181.html

2016 - 2- 2 非正式协议与正式协议相关推荐

  1. Object-C非正式协议与正式协议的区别

    Object-C非正式协议与正式协议的区别 Object-C非正式协议与正式协议的区别 - braddoris的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/br ...

  2. 非正式协议和正式协议的区别

    这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是相对于正式协议而言的.在解释非正式协议之前, ...

  3. OC中的非正式协议与正式协议的区别

    声明:以下内容转自:http://blog.csdn.net/wzzvictory/article/details/9295317# 这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什 ...

  4. 类别,非正式协议,正式协议

    类别,非正式协议,正式协议 1类别: 1.1 不能添加新的实例变量 1.2 如果一定要在类别中使用实例标量,可以使用全局变量 关联 额外变量 注:Cocoa中没有任何真正的私有方法,只要知道对象支持的 ...

  5. 非正式协议与正式协议的区别

    正式和非正式协议 协议有两种类型-正式协议和非正式协议: 非正式协议是NSObject类的范畴类(范畴类是语言特征.通过它,您无需子类化就向某个类增加方法),这意味着几乎所有的对象都是非正式协议的采纳 ...

  6. IOS开发协议使用之──非正式协议和正式协议

    转载地址:http://www.iloss.me/?p=545 协议分非正式协议和正式协议 先说说非正式协议 非正式协议在Obj-c中关键字虽然是interface,但是这个和C#中的借口并不完全相同 ...

  7. Objective-C非正式协议与正式协议

    为什么80%的码农都做不了架构师?>>>    类别与类扩展的区别: ①类别中只能增加方法: ②是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例 ...

  8. OC正式协议和非正式协议

    1.概念 非正式协议,非正式协议是NSObject类(包括它的子类)的类别,其所有的子类都含蓄地接受了这个协议.非正式协议中的方法是否实现都是可选的,因此在调用非正式协议中的方法之前,需要去检查对象类 ...

  9. OC正式协议和非正式协议的区别

    最近看了些关于objective-c的正式协议和非正式协议的内容,发现还是有些混乱,可能是因为还不熟悉OC,对正式协议和非正式协议的使用还不是很熟练,所以想整理一下 非正式协议,是使用类别catego ...

最新文章

  1. Android 蓝牙4.0在实际开发中的运用
  2. Web前后端交互总结
  3. 最简单的视音频播放示例1:总述
  4. [Python] 关键字 yield 用法详解
  5. python中string、json、bytes的转换
  6. redis 分布式锁_基于 Redis 实现的分布式锁
  7. create-react-app 支持多入口
  8. [转] android自定义布局中的平滑移动
  9. Java全国计算机等级考试二级笔记---操作题部分
  10. 后勤管理系统-在线报修系统
  11. 制作Docker镜像,用来下载OpenJDK11源码
  12. 如何通过编程打开一个网页
  13. 爬虫练习:爬取网易云音乐热歌榜全部歌曲的热门评论
  14. html:link-icon标签引入网站小图标favicon.ico
  15. html 两个时间戳相减,表格里两列时间点如何相减
  16. java基础 IO流
  17. Unity打开电脑本地文件夹选择图片替换
  18. 高中计算机专业班主任工作总结,高中班主任工作总结
  19. 注册表编程,程序记忆功能
  20. cfa的pv怎么用计算机算,cfa计算器 算pv

热门文章

  1. 【科普】半监督学习的概述与思考,及其在联邦学习场景下的应用
  2. CVPR2020 夜间目标检测挑战赛冠军方案解读
  3. OpenCV相机标定与畸变校正
  4. 500位全球算法开发者零奖金参加阿里云天池大赛 AI预测台风助力防灾减灾
  5. 双目立体放大!谷歌刚刚开源的这篇论文可能会成为手机双摄的新玩法
  6. 思考问题:Python这两段等效代码内存占用为什么差别那么大?
  7. 从零开始拿到了Kaggle竞赛冠军
  8. 教程|YOLOX目标检测ncnn实现
  9. 收藏 | 有没有什么可以节省大量时间的 Deep Learning 效率神器?
  10. 【收藏】机器学习数据集列表:你需要收藏!