编写高质量OC代码52建议总结:23.通过委托与数据源协议进行对象间通信

 委托模式:定义一套接口,某对象如果想接受另一个对象的委托,需要遵循此接口,成为其“委托对象”。
 例如:要编写一个从网站获取数据的类,此类也许要从远程服务器的某个资源里获取数据。那个远程服务器可能很久之后才会有反应。这种情况下,我们可以使用委托模式。获取网络数据的类中含有一个“委托对象”,获取完数据后,它会回调这个委托对象。EOCDataModel对象就是EOCNetworkFetcher的委托对象。EOCDataModel请求EOCNetworkFetcher“以异步方式执行任务”,而EOCNetworkFetcher执行完任务后会通知其委托对象EOCDataModel。
 委托协议名通常是在相关类名后面加上delegate,整个类名采用“驼峰命名”
 类用一个属性存放其委托对象,这个属性一定要是week,因为两者之间必须为“非拥有关系”,通常情况下,扮演delegate的那个对象也要持有本对象。
 想使用EOCNetworkFetcher的那个对象就会持有本对象,直到用完本对象后,才会释放。本对象和委托对象如果是“拥有关系”,就会产生循环引用。
 实现委托对象的方法是声明某个类遵循委托协议,然后把协议中想实现的哪些方法在类中实现。委托协议中方法一般都是”可选的(optional)“,被委托者未必关心协议中的所有方法。所以,协议中通常用@optional关键字来标注大部分方法。如果要在委托对象上调用可选方法,必须提前使用类型信息查询来判断委托对象是否实现了相关方法,如果实现了就调用,没实现就什么都不做,这样就不用担心因为哪个方法没实现而导致程序出问题。
 例如:用户界面框架中“列表视图”对象可能会通过数据源协议来获取要在列表中现实的数据。除了数据源之外,列表视图还有一个委托者,用于处理用户与列表的交互操作。将数据源协议与委托协议分开,使接口更加清晰。
 但是,如果频繁的进行类型信息查询操作,只有第一次检测结果是有用的,剩下的检测都是多余的。我们通常把委托对象能否响应某个协议方法这一信息缓存起来,以优化程序效率。
 
 总结:
 1.委托模式为对象提供了一套接口,使其可由此将相关事件告知其他对象
 2.将委托对象应该支持的接口定义成协议,在协议中把可能需要处理的事件定义成方法。
 3.当某个对象需要从另一个对象中获取数据时,可以使用委托模式。
 4.如果有必要,可以实现含有位段的结构体,将委托对象是否能相应相关协议方法这一信息缓存其中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值