(六) 协议与分类

第23条:通过委托与数据源协议进行对象间通信。

Objective-C广泛使用委托模式(Delegate patttern)来实现对象间的通信,其主旨是:为对象A定义一套接口,对象B接受对象A的委托,需要遵从这套接口。通过接口,对象A在发生事件时可以通知对象B,也可以向对象B传递信息。接口通常以协议(protocol)方式呈现。

委托模式可将数据与业务逻辑解耦。比如,UI视图只应包含显示数据逻辑,其数据交互处理可交由委托对象处理。视图一般包含负责数据的数据源(data source)对象和负责事件的委托(delegate)对象。为避免循环引用,视图对委托属性必须是非拥有关系,需要使用weak关键字。

协议中使用@optional关键字表示委托对象可选择是否实现方法,调用该方法前需要先用respondsToSelector:来检测方法是否已实现,判断结果特定场景下可缓存起来,减少检测次数。

协议中必须实现的方法通常用于强制实现的接口规范,可直接调用。


第24条:将类的代码分散到便于管理的多个分类中。

Objective-C分类机制,可以把类代码按逻辑划入几个分区中,利于开发和调试。类的基本要素,如属性、初始化方法等都在主实现(main implement)声明,不同类型的操作方法则归入各个分类中。

编写程序库时,可以考虑创建private分类,实现私有方法,隐藏实现细节。


第25条:为第三方类的分类及其方法名加上前缀。

因为Objective-C分类可以多个并存,为第三方类添加分类,使用简单名称,可能会存在同名分类和相同方法,导致其中一个分类方法被覆盖,有可能产生非预期结果。解决问题的建议是为分类及其方法名加上专用前缀,降低冲突几率。


第26条:分类中尽量不要声明属性。

分类无法合成与属性相关的实例变量,如果在分类声明属性,需要为该属性实现存取方法,可声明为@dynamic,到运行期才能提供,编译期不可见。

关联对象能够解决分类中不能合成实例变量的问题,需要遵从内存惯例语义。一般情况下并不推荐使用关联对象,因此,应尽量在主实现声明属性。


第27条:使用class-continuation分类隐藏实现细节。

class-continuation分类定义在类的实现文件中,用于隐藏实现细节,格式如下

@interface className () {

// 实例变量

}

// proterty

// method

@end

Objective-C可能包含C++代码,如果在头文件引入C++头文件,那么实现文件不能使使用.m扩展名,而要使用.mm扩展名。如果使用C++编写的第三库采用这种方式,则必须要求使用者的实现文件使用.mm扩展名,这样做不太合适。使用class-continuation分类添加C++的实例变量可以解决这个问题,只需要在实现文件引入C++头文件,对外提供的纯Objective-C接口,对于使用者来说比较友好。

class-continuation分类还有一种用法,是把在public接口声明为只读的属性,扩展为可读写。这样外部无法修改属性,内部比较容易管理数据。例如

头文件声明类

@interface EOCPerson : NSObject

@property (nonatomic, copy, readonly) NSString * firstName;

@end

实现文件可使用class-continuation分类进行扩展

@interface EOCPerson ()

@property (nonatomic, copy, readwrite) NSString * firstName;

@end

如果需要隐藏协议细节,也可以使用class-continuation分类,例如

@interface EOCPerson () <EOCSecretDelegate>

@end


第28条:通过协议提供匿名对象。

Objective-C可以用协议把API实现细节隐藏起来,对外仅提供遵从协议对id类型(匿名对象,anonymous object)。使用者不知道API的名称和细节,也不关心。匿名对象表明具体类型并不重要,仅需要能响应协议方法。在程序设计中,同一套协议接口,可能会由不同的对象来实现。数据持久化常使用匿名对象,如数据库、文件处理、缓存等等。

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

推荐阅读更多精彩内容