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

Objective-C语言特性:协议protocol),它与Java的“接口”(interface)类似。

Objective-C不支持多继承,但可以把类的实现方法定义在协议里面。

协议最为常见的用途是实现委托模式(Delegate pattern)

委托模式(Delegate pattern):

用来实现对象间的通信,

该模式的主旨是:定义一套接口,某对象若想授受另一个对象的委托,则需遵从此接口,以便成为其“委托对象”(delegate)。而这“另一对象”则可以给其委托对象回传一些消息,也可以在发生相关事件时通知委托对象。

此模式可以将数据与业务逻辑解耦

数据源(data source)与委托(delegate)对象分别处理。

数据源:数据源流向类(输入),

委托:从类流向受委托者(输出)。

数据源和受委托者可以是两个不同的对象。然而一般情况下,都用同一个对象来扮演这两种角色。

委托协议命名

类名+Delegate(后缀)

有了协议后,类就可以用一个属性来存放其委托对象了。

例:

@property(nonatomic, weak) id<类名+Delgate> delegate;

// 此处用weak表示“百拥有关系”(nonowning relationship)。

// 还可以用unsafe_unretained

// weak与unsafe_unretained的区别:如果需要在相关对象销毁时自动清空(autoniling,参见第6条),则用weak。反之用unsafe_unretained。

@optional关键字(可选的):

在委托对象上调用可选方法时必须提前使用类型信息查询方法(参见第14条)来判断这个委托对象能否响应相关选择子。

例:if([_delegate respondsToSelector:@selector(委托方法)]) {

  [_delegate 委托方法];

}

如果非可选方法,则不需要。

关于选择子判断的优化:

有时除了第一次检测的结果有用之外,后续的检测可能是多余的。对于频繁的检测,也消耗性能

对此可以优化:把委托对象能否响应某个协议方法这一信息缓存起来。

位段:

将方法响应能力缓存起来的最佳人途径是使用“位段”(bitfield数据类型。这是一项无人问津的C语言特性

结构体中某个字段所占用的二进制位个数设为特定的值。

例:struct data {

  unsigned int fieldA: 8; // 表示0~255之间的值

  unsigned int fieldB: 4;

  unsigned int fieldB: 1; // 表示0或1

}

这样就可以嵌入一个含有位段的结构体作为实例变量,而结构体中的每个位段表示delegate对象是否实现了协议中的相关方法。(类似字典

例:struct {

  unsigned int didReceiveData: 1;

  unsigned int didFailWithError: 1;

  unsigned int didUpdateProgressTo: 1;

} _delegateFlags;

-(void)setDelegate:(id<协议> delegate){

  _delegate = delegate;

  _delegate.didReceiveData = [@delegate respondsToSelector:@selector(方法)]; // 值为:0或1

  // ……

}

if(_delegate.didReceiveData) {

  [_delegate 方法]  

}

delegate对象可以有多个,所以在定义或调用时,应该把发起委托的类或实例加入进去。

例:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  if(tableView == tableViewA){

  }else if(tableView == tableViewA){

  }

}

时间: 2024-10-18 11:14:28

第23条:通过委托与数据源协议进行对象间通信的相关文章

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

第4章:协议与分类 Objective-C 语言有一项特性叫做"协议"(protocol),它与 Jave 的 "接口"(interface)类似.Objective-C 不支持多重继承,因而我们把某个类应该实现的一系列方法定义在协议里面.协议最为常见的用途是实现委托模式,不过也有其他用法.理解并善用协议可令代码变得更易维护,因为协议这种方式能很好的描述接口. "分类"(category)也是 Objective-C 的一项重要语言特性.利用分类

网络工程:2.1.ARP协议与PC间通信

ARP协议功能:通过解析网路层IPV4地址来找寻数据链路层MAC地址的一个网络传输协议 ARP协议格式 每台带ARP协议设备表格式  1.PC间正常通信原则一(双方PC能相互访问) ① 需求:1.1.1.2与1.1.1.3正常通信(本机无其他设备ARP信息) 1) 结果:小明正确的把自己的MAC填进题目中并提交回去(通信成功) 最终请求协议如下: 最终应答协议如下: 最终1.1.1.2点ARP表如下 主机 IP地址 MAC地址 A 1.1.1.2 0C:3E...... B 1.1.1.3 QW

普通选择器&lt;数据源协议,委托协议&gt;(IOS开发)

-普通选择器必须满足这两个协议,一个为委托协议,一个为数据源协议 -委托协议负责控制控件UI.事件响应, 实现可选 -数据源协议负责控件与应用数据模型的桥梁,一般必须实现 @interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> // // ViewController.h // PickViewSample // // Created by 李亚坤 on 14-10-

组件接口(API)设计指南[3]-委托(delegate)和数据源协议(data-source protocols)

*返回目录阅读其他章节: http://blog.csdn.net/cuibo1123/article/details/39894477 委托(delegate)和数据源协议(data-source protocols) 委托协议是一个非常好的设计,它能让你用简单灵活的方式去实现MVC模式,并能增强松散耦合以及养成良好的API设计习惯. 这里是MGTileMenu的委托协议. 我们几乎可以在任何组件中利用经典的委托(delegate)和数据源协议(data-source protocols).如

常见的选择&amp;lt;数据源协议,委托协议&amp;gt;(IOS发展)

-常见的选择必须满足这两个协议,约定实施.一个为数据源协议 -托付协议负责控制控件UI.事件响应, 实现可选 -数据源协议负责控件与应用数据模型的桥梁,一般必须实现 @interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> // // ViewController.h // PickViewSample // // Created by 李亚坤 on 14-10-21.

架构设计:系统间通信(20)——MQ:消息协议(下)

(接上文<架构设计:系统间通信(19)--MQ:消息协议(上)>) 上篇文章中我们重点讨论了"协议"的重要性,并为各位读者介绍了Stomp协议和XMPP协议.这两种协议是消息队列中两种不同使用场景下的典型代表.本文主要接续上文的篇幅,继续讨论消息队列中另一种典型协议:AMQP协议. 3-3.AMQP协议 AMQP协议的全称是:Advanced Message Queuing Protocol(高级消息队列协议).目前AMQP协议的版本为 Version 1.0,这个协议标准

winform 客户端 HTTP协议与服务端通信

本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GET方式获取数据的,MSN截图如下: 还是不要脱离本文的主要目的: 模拟实现登录代码如下: 1 private void pictureBox3_Click(object sender, EventArgs e) 2 { 3 string strUserName = textEdit1.Text.Tr

C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它

C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usi

架构设计:系统间通信(23)——提高ActiveMQ工作性能(中)

(接上文<架构设计:系统间通信(22)--提高ActiveMQ工作性能(上)>) 6.ActiveMQ处理规则和优化 在ActiveMQ单个服务节点的优化中,除了对ActiveMQ单个服务节点的网络IO模型进行优化外,生产者发送消息的策略和消费者处理消息的策略也关乎整个消息队列系统是否能够高效工作.请看下图所示的消息生产者和消息消费者的简要工作原理图: Producer既是消息生产者,作为一个发送消息的客户端它既可以使用同步消息发送模式,也可以使用异步的消息发送模式.另外,消息生产者在Acti