iOS 通过协议实现的匿名类对象

在ios中,协议的使用非常广泛,它定义了一系列的方法,这些方法可以是必须实现的也可以是可选性的。这个特性非常有利于我们将API中的细节隐藏起来,从而通过返回对象的方法设计出遵守协议的纯id类型。
一般,我们在定义“受委托者(delegate)”属性的时候,是这样写的:

@property(nonatomic,assign) id<ECProjectDelegate> delegate;

由于这个属性的类型是id<ECProjectDelegate>,所以实际上是任何类型的对象都能充当这个属性,及时这个类不继承NSObject也行,但必须遵循ECProjectDelegate协议。
使用广泛的NSDictionary就很好的说明了这个概念。在字典中,key的标准内存管理语义是“设置时copy”,而Value的语义则是“设置时保留”。因此在可变版本的字典中,设置Key—Value键值对所用的方法是:

-(void)setObject:(id)object forKey:(id<NSCopying>)key;

表示Key的那个参数其类型为id<NSCopying>,作为参数值的对象,它可以是任何的NSCopying协议就行了,这样的话,就可以向这个对象发送拷贝消息了。
这个key参数可以视作匿名对象,这个与delegate属性一样,字典也不关心key对象到底是什么类型。

举个栗子!!

在处理数据库的连接过程中,以匿名对象表示从另外一个库返回的对象。对于处理连接的那个类,由于想隐藏方法的名字,因为不同的数据库可能要用不同的类处理。如果没办法让这些方法都继承自同一个基类,那么就得返回id类型的方法了。但是我们还是可以吧所有的数据库连接都具备的那些方法放到协议中。使返回的对象遵从这个协议,协议可以这么写:
假设协议中的内容:

@protocol ECProjectConnection
-(void) connect;
-(void) disconnect;
-(BOOL) isConnected;
-(NSArray *) performQuery:(NSString *)query;
 @end

然后可以用数据库处理器单例来提供数据库连接,这个单例的接口可以写成:

#import <Foundation/Foundation.h>

@protocol ECProjectConnection;
@interface ECDataBaseManager:NSObject
+(id)sharedInstance;
-(id<ECProjectConnection>)connectionWithIdentifier:(NSString *)identifier;
@end

如此一来,你处理数据库所用连接的类的名字就不会泄漏了,那些来自不同框架的类现在都可以通过这个方法来返回了,使用此API的开发者仅需要所返回的对象,能用来连接、断开、查询数据库就可以了。
在很多时候,我们写代码的时候为了快速开发,通常会使用别的很多第三方库来实现我们的功能,这时候,我们就可以创建匿名对象把这些类简单封装一下。使匿名对象成为其子类,并遵循拟定的协议,然后就可以同过类似于“connectionWithIdentifier:”方法来返回这些类的对象。

说了那么一大堆有什么用呢?

  • 协议可以在某种程度上提供匿名类型,具体可以通过淡化了的对象类型:id类型,来实现。协议中定制好对象所应实现的方法即可!
  • 使用匿名对象来隐藏类型名称。
  • 如果具体类型不重要,重要的是对象能够响应特定方法,那么也可以使用匿名对象来表示。

此等高级技能来自《Objective-C 实用装逼52招》!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,517评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,103评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,296评论 18 399
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,037评论 29 470
  • 三十岁被水冲上岸 一条老咸鱼 四十岁搁浅在沙滩 晒着太阳不再挣扎 上班的日子 习惯用月光晒着一些心事 在背对青春之...
    李文冲阅读 243评论 0 1