Objective-C中的协议(Protocol)和类别(Category)
1.什么是协议?
2.协议与类别的声明和使用
1.什么是协议?
在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议。协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承。
协议包括正式协议和非正式协议。
正式协议:其声明一个方法列表,协议的实现者需要实现声明的方法,可以使用@required和@optional关键字指定方法必须实现或可选实现,默认为必须实现。子类会继承其父类采用的协议,一个协议本身也可以采用别的协议
非正式协议(类别):类别是Objective-C的一个语言特点,可以让你在无需子类化的前提下为一个类增加方法。凡是NSObject或其子类的类别,都是非正式协议。一个类不必实现非正式协议中的每个方法,只需实现它想要的方法就可以。声明非正式协议的类在向某个目标对象发送协议消息之前,必须首先向它发送respondsToSelector:消息并得到肯定的回答,才可以使用。
2.协议与类别的声明和使用
正式协议的声明很简单,在类声明的上方
@protocol ProtocolName
//方法声明
@end
在另一个采纳协议的类中声明
@interface ClassName:NSObject<NSCopying>
{
//实例变量
}
//方法
@end
也可以采用多个协议,只需用逗号隔开
@interface ClassName:NSObject<NSCopying,NSCoding>
{
//实例变量
}
//方法
@end
声明可选和必须实现的协议
@protocol ProtocolName
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end//MyProtocol
非正式协议(类别)声明和使用,类别名也要符合骆驼命名法。类别的声明和实现可以放在单独的 ”类别名.h/类别名.m“中,也可以放在已有类的.h/.m文件中。
在类别的.m文件中加入@interface和@end,在这中间可以声明私有方法。
@interface ClassName(categoryName)
//方法定义
@end
实现
@implementation ClassName(categoryName)
//方法实现
@end
需要注意的是类别只能添加方法,不能添加实例变量。
------------------------------------------------------------------------------------------------------------------------
不声明类别名的时候,是匿名类别或类扩展,可以为已存在的类添加实例变量,方法。只能放置在已有类的.h/.m中
@interface ClassName(){
//实例变量--只能在自身类内使用
}
//方法定义--在.h文件中声明为公开的,在.m中声明的方法为私有的。
@end
Objective-C中的协议(Protocol)和类别(Category)的更多相关文章
- Objective-C 中的协议(@protocol)和接口(@interface)的区别
Objective-C 中的协议(@protocol),依照我的理解,就是C#, Java, Pascal等语言中的接口(Interface).协议本身不实现任何方法,只是声明方法,使用协议的类必须实 ...
- Swift和Objective-C中的协议(protocol)有什么异同
Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...
- Objective中的协议(Protocol)
Objective中的协议(Protocol) 作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法 ...
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol
关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...
- 协议 protocol
协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(formal protocol)--------------- ...
- Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考
总结:继承.分类(Category.extension).协议(protocol) 一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...
- Server-Speaks-First 有点坑,Linkerd 2.10 中的协议检测和不透明端口
协议检测(Protocol detection),顾名思义,允许 Linkerd 自动检测 TCP 连接中使用的协议. Linkerd 的设计原则之一是"just work",协议 ...
- 窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用
协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) - ...
- DNS 中的协议字段详细定义
DNS中的协议字段定义 Table of Contents 1 概述 2 DNS Classes 3 DNS OpCodes 4 DNS RCODEs 5 DNS Label Types 6 DNS资 ...
随机推荐
- Gvim各种插件配置(windows环境下)
1.Vundle插件:https://github.com/gmarik/Vundle.vim 用于管理Vim插件,安装此插件需要系统中已安装git,参考链接:Git for Windows安装和基本 ...
- bzoj3438
很容易想到是最小割模型首先对于一个点i,从s到i连一条容量为ai的边,再从i连一条容量为bi的边到t然后就是处理附加权的问题了一开始受到之前的思维定势的影响,一直在思考怎么在作物之间连边由于每种额外收 ...
- WordPress Comment Extra Fields插件‘swfupload.swf’跨站脚本漏洞
漏洞名称: WordPress Comment Extra Fields插件‘swfupload.swf’跨站脚本漏洞 CNNVD编号: CNNVD-201308-027 发布时间: 2013-08- ...
- HDU 1523 Decoding Morse Sequences
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1523 此题大意为 给你一串摩尔斯密码 再给你一个字典(下面单词本) 用下面的单词组合成给你的摩尔斯密 ...
- 【线段树】BAPC2014 E Excellent Engineers (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- 搭建ftp环境
首先明确,ftp站点设置在服务器上,而在客户端上来使用ftp工具来进行上传文件 具体环境搭建如下两个链接,一个server2003,一个是win7 server2003:http://jingyan. ...
- Andriod视频http://pan.baidu.com/share/link?shareid=7300&uk=3339495714
老罗Android开发 视频教程 一.Android入门介绍 视频教程 1.1 android系统介绍 1.3 如何搭建android开发环境 1.5 androi ...
- bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1841 Solved: 857[Submit][ ...
- CodeForces 221(div 2)
A 无trick水题... /* * Author: Plumrain * Created Time: 2013-12-24 22:26 * File Name: B.cpp */ #include ...
- Linux下多任务间通信和同步-概述
Linux下多任务间通信和同步-概述 嵌入式开发交流群280352802,欢迎加入! 在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对 ...