余果的博客

Objective-C中的“委托(delegate)”和“协议(protocal)”

Introduction

user

余果

一个产品设计师。了解详情


Featured

Objective-C中的“委托(delegate)”和“协议(protocal)”

余果 iOS

委托是Objective-C中最常用的一种回调机制。大部分情况下,“协议”的用法是跟“委托”同义的,所以本文一起来讲。

委托是一个指向一个对象的指针,该对象有一系列方法,该对象的委托人(另一个对象)非常清楚这些方法,并且会在某些事件发生的时候调用这些方法。简单的说,这是一种机制,允许后创建的对象(later-created object)来调用特定的回调函数

一个简单的例子是UIAlertView(没有编辑器写长类名真不习惯),你创建一个UIAlertView的实例来显示一个对话框,用户会点击OK或者Cancel,那么对话框得知哪个按钮被点击之后,它需要告诉你这一信息(调用你的方法),但它不知道调用哪个对象,调用哪个方法。

解决办法就是把self指针发送给UIAlertView作为一个委托对象(以此告诉它调用哪个对象),作为交换,你同意实现(implement)一些UIAlertView知道的方法(称为协议,以此告诉它调用哪些方法),这样UIAlertView对象就知道调用你的某某方法。如何实现这些方法呢?在你对象的头文件中声明UIAlertViewDelegate即可。

这些方法可能是:alertView:clickedButtenAtIndex:

那么UIAlertView的第一个按钮被按下之后,它就直接调用它的委托对象的clickedButtenAtIndex方法。

委托方法通常包括3种动词:should、will、did。

should表示一个动作发生前,通常带有返回值,可以在动作发生之前改变对象状态。

will在动作发生前,委托可以对动作做出响应,但不带有返回值。

did在动作发生后做出的响应。

从方法的定义我们不难看出委托模式能够起到两方面的作用:

第一:委托协助对象主体完成某项操作,将需要定制化的操作通过委托对象来自定义实现,达到和子类化对象主体同样的作用。

第二:事件监听,委托对象监听对象主体的某些重要事件,对事件做出具体响应或广播事件交给需要作出响应的对象。

user

余果

一个产品设计师。 了解详情