[HMLY]12.iOS中的Protocol
最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出来的属性中包含了NSObject协议中的property。查来查去,只是知道和protocol有关。晚上问了下朋友(iOS大神),结果被他一句点破。发现这部分知识点遗漏了一点。
protocol类似java中的interface,主要是用来定义一套对象之间的通信规则。protocol也是我们设计时常用的一个东西,相对于直接继承的方式,protocol则偏向于组合模式。因为在设计对象的时候,如果基类东西很多,而不同的子类又不一定都需要基类的东西,或者在绝大部分需要的同时,又有特殊的要求,那这个时候就很混乱了。采用接口,可以将不同的功能归类为不同的接口,这样,子类需要什么功能,自己去实现这个接口,这样在保持继承性的同时,可以对功能进行扩展,而不影响其他类,也让子类保持自己的特有性。
protocol语法:
@protocol protocolName //method //property @end和类的声明很相似,不仅可以声明方法,同样也可以声明property。如果某个类需要实现某个接口,则只需要在类的申明后面加上<>,在里面写上要实现的协议名字,多个协议以逗号隔开。
@interface Test : NSObject <delegate1, delegate2>
@end
protocol关键字:required,optional
@protocol TestProtocol @requiredprotocol默认都是required的,一个类在实现协议的时候是必须要实现这些方法的。相对的,如果optional下面的方法,则表示类可以选择性的实现。判断这个类是否实现某个方法则只需调用
- (void)requiredMethod;
@optional
- (void)optionalMethod;
@end[self.delegate respondToSelector:@selector()]
protocol的继承
protocol和类一样,同样可以进行继承,这个也是我遗漏的一点。
@protocol Test1Delegate这个时候,如果类实现了Test2Delegate这个协议,那么也必须实现Test1Delegate里面的方法。 我们自己写的protocol的时候,一般Xcode都默认帮我们继承了NSObject这个协议。如果你不继承的话也没啥大的影响,因为我们的对象都是继承自NSObject,而NSObject也实现了
@end @protocol Test2Delegate <Test1Delegate>
@end;NSObject这个协议。所以,当我们需要调用NSObject协议里面的方法的时候,也不会出错。不过苹果还是推荐继承NSObject这个协议。
protocol隐藏类的类型
在我们iOS开发中也会出现这种形式,比如iOS7的导航栏动画,苹果只是需要你返回一个实现了UIViewControllerAnimatedTransitioning这个协议的对象就行了。
还有一个可能在和第三方sdk打交道的时候见得比较多。在别人实现的框架里面,有的时候,不希望把类的类型和里面方法暴露给你,而你也不太可能直接创建这个对象。这个时候就可以采用protocol这个方式,让调用者无需知道类的类型,一样可以完成自己想要的操作。
id <Test1Delegate>obj = [XXXX createObj];
调用者只需要通过[XXXX createObj]这个方法,获取一个实现Test1Delegate而不知道类型的实例。在需要的地方,这个obj可以直接调用协议里面的方法,因为,这个对象都已经实现了。
protocol 差不多就这么多内容,比较简单。
[HMLY]12.iOS中的Protocol的更多相关文章
- [HMLY]10.iOS中block的基础用法
本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
- iOS中JSONModel的使用
iOS中JSONModel的使用 流弊的JSON数据模型框架 https://github.com/jsonmodel/jsonmodel 版本 1.3.0 如果你喜欢JSONModel,并且使用 ...
- IOS中调用系统的电话、短信、邮件、浏览功能
iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...
- ios 中的小技巧 - 总有你想要的 一
UITableView的Group样式下顶部空白处理 在viewWillAppear里面添加如下代码: //分组列表头部空白处理 CGRect frame = myTableView.tableHea ...
- iOS中的代理和Block
一.代理(Delegate) 1)含义 iOS中的代理,比如父母要去上班,到中午12点了,需要给宝宝喂饭吃,但是父母正在上班,这时需要有一个人来帮忙完成一些事情(需要有个保姆来帮忙给宝宝喂饭),此时, ...
- 聊聊iOS中网络编程长连接的那些事
1.长连接在iOS开发中的应用 常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection.NSURLSession或者是AFNetworking ...
- 正则表达式在iOS中的运用
1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- iOS 中常用的对密码进行MD5加密
iOS中MD5加密 标签(空格分隔): iOS MD5 + (NSString *)MD5:(NSString *)str { const char *cStr = [str UTF8String]; ...
随机推荐
- 【MS SQL】数据库维护计划之数据库备份(一)
原文:[MS SQL]数据库维护计划之数据库备份(一) 在做数据库备份之前,一定会听到:完整备份.差异备份.增量备份.事务日志备份...等词:下面配图进行说明. 完整备份:完整数据库备份包含数据库中的 ...
- postal邮件发送(三):以附件形式显示图片
前言 上篇提到如果邮件中有图片的话,可以使用 @Html.EmbedImage("~/Content/postal.png") 这种方式,但是经过测试发现,在outlook中如果有 ...
- 读书笔记—CLR via C#线程25-26章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- Android中常用的颜色
代码: <?xml version=”″ ?> <resources> <color name=”white”>#ffffff</color><! ...
- 玩转python之测试一个对象是否是类字符串
提到类型测试,我首先想到python中“鸭子类型”的特点,所谓鸭子类型,即如果它走路像鸭子,叫声也像鸭子, 那么对于我们的应用而言,就可以认为它是鸭子了!这一切都是为了功能复用. 我们总是需要测试一个 ...
- [Usaco2008 Mar]Cow Travelling游荡的奶牛[简单DP]
Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John ...
- 欧几里德算法及其扩展(推导&&模板)
有关欧几里德算法整理: 1.一些相关概念: <1>.整除性与约数: ①一个整数可以被另外一个整数整除即为d|a(表示d整除a,通俗的说是a可以被d整除),其含义也可以说成,存在某个整数k, ...
- Jackson 格式化日期问题
Jackson 默认是转成timestamps形式的,如何使用自己需要的类型, 解决办法: 1.在实体字段上使用@JsonFormat注解格式化日期 @JsonFormat(locale=" ...
- python读写protobuf
0. 前期准备 官方protobuf定义 https://code.google.com/p/protobuf/ python使用指南 https://developers.google. ...
- 温故而知新之java的collection framwork
经常用到的List,Map等这些数据结构,都是来自于java的util包下,而java对于其整体设计,简称为collection framwork.(ps.其实,Map接口并不继承自collectio ...