我将尝试用一个例子来解释委托的价值。
假设你有一张桌子;该表将显示一些行。假设现在,您想要自定义此表对某些事件的反应方式,例如,选择特定行。
在 OOP 中执行此操作的一种常见方法是子类化表基类并覆盖那里的一些方法。
使用委托,您不需要子类化表基类;相反,您使用基类并告诉它“转发”一些消息到其他对象。这是基本思想。
在我们的示例中,当单击该行时,表基类除了向您指定为委托的一个对象发送消息以执行该操作外,不知道做什么。
因此,委托的一个基本优点是您不需要子类化。您拥有的另一个优点是委托可以充当其他几个对象的委托。事实上,如果你看一下委托方法的泛型声明,你会发现第一个参数是委托的对象:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
所以当代理接收到消息时,它知道是谁发送的以及它应该与哪个对象交互。
我为您提供的有关表格的示例显示了一种委托,我不会将其与回调进行比较。无论如何,可以使用委托以及一种高级回调方案。
上课NSURLConnection;它可用于管理异步通信。
异步通信是使用回调的典型情况。
使用NSURLConnection,首选委托模式;因此,您无需指定回调(必须是静态函数或静态类方法的函数),而是指定一个对象。该对象实现了协议定义的方法(NSURLConnectionDelegate 协议);您可以将它们视为一整套回调函数。当NSURLConnection有数据准备好时,它会调用接口的一个方法,例如– connection:didReceiveResponse:,通知它已经收到响应。
在这种情况下,重点不是避免子类化,而是更灵活的回调机制(基本上允许更好的封装)。
我希望这有助于澄清这两个概念...