2016 - 2- 2 非正式协议与正式协议
在重温《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 非正式协议与正式协议相关推荐
- Object-C非正式协议与正式协议的区别
Object-C非正式协议与正式协议的区别 Object-C非正式协议与正式协议的区别 - braddoris的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/br ...
- 非正式协议和正式协议的区别
这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是相对于正式协议而言的.在解释非正式协议之前, ...
- OC中的非正式协议与正式协议的区别
声明:以下内容转自:http://blog.csdn.net/wzzvictory/article/details/9295317# 这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什 ...
- 类别,非正式协议,正式协议
类别,非正式协议,正式协议 1类别: 1.1 不能添加新的实例变量 1.2 如果一定要在类别中使用实例标量,可以使用全局变量 关联 额外变量 注:Cocoa中没有任何真正的私有方法,只要知道对象支持的 ...
- 非正式协议与正式协议的区别
正式和非正式协议 协议有两种类型-正式协议和非正式协议: 非正式协议是NSObject类的范畴类(范畴类是语言特征.通过它,您无需子类化就向某个类增加方法),这意味着几乎所有的对象都是非正式协议的采纳 ...
- IOS开发协议使用之──非正式协议和正式协议
转载地址:http://www.iloss.me/?p=545 协议分非正式协议和正式协议 先说说非正式协议 非正式协议在Obj-c中关键字虽然是interface,但是这个和C#中的借口并不完全相同 ...
- Objective-C非正式协议与正式协议
为什么80%的码农都做不了架构师?>>> 类别与类扩展的区别: ①类别中只能增加方法: ②是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例 ...
- OC正式协议和非正式协议
1.概念 非正式协议,非正式协议是NSObject类(包括它的子类)的类别,其所有的子类都含蓄地接受了这个协议.非正式协议中的方法是否实现都是可选的,因此在调用非正式协议中的方法之前,需要去检查对象类 ...
- OC正式协议和非正式协议的区别
最近看了些关于objective-c的正式协议和非正式协议的内容,发现还是有些混乱,可能是因为还不熟悉OC,对正式协议和非正式协议的使用还不是很熟练,所以想整理一下 非正式协议,是使用类别catego ...
最新文章
- Android 蓝牙4.0在实际开发中的运用
- Web前后端交互总结
- 最简单的视音频播放示例1:总述
- [Python] 关键字 yield 用法详解
- python中string、json、bytes的转换
- redis 分布式锁_基于 Redis 实现的分布式锁
- create-react-app 支持多入口
- [转] android自定义布局中的平滑移动
- Java全国计算机等级考试二级笔记---操作题部分
- 后勤管理系统-在线报修系统
- 制作Docker镜像,用来下载OpenJDK11源码
- 如何通过编程打开一个网页
- 爬虫练习:爬取网易云音乐热歌榜全部歌曲的热门评论
- html:link-icon标签引入网站小图标favicon.ico
- html 两个时间戳相减,表格里两列时间点如何相减
- java基础 IO流
- Unity打开电脑本地文件夹选择图片替换
- 高中计算机专业班主任工作总结,高中班主任工作总结
- 注册表编程,程序记忆功能
- cfa的pv怎么用计算机算,cfa计算器 算pv