论坛首页 移动开发技术论坛

iPhone开发中的代理与协议(Delegate and Protocol)

浏览 6298 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-06-24  
iOS
我们可以通过发送消息给对象出发特定动作,但对象发送某些变化的时候用什么方法通知我们呢?对的,通过回调函数(callback)。对象在特定事件发生的时候,就会调用对应的回调函数,触发业务逻辑。

在iPhone的开发框架中,回调函数通过所谓的代理(Delegation)来实现,举例说明:每个UITextView对象都有一个delegate属性,该属性指向一个特定的对象,所谓特定指的是该对象遵从特定的协议(Protocol),这个与Java中的Interface应该是同一概念,指的是预定义方法的集合,如:

@protocol UITextViewDelegate

@optional
-(BOOL) textViewShouldBeginEditing: (UITextView *)text View;
-(BOOL) textView:(UITextView *)text View
               shouldChangeTextInRange:(NSRange) range
               raplacementText:(NSString *)text;
-(void) textViewDidChange:(UITextView *)textView;
@end


单对象的特定事件触发的时候,对象就会调用delegate指向对象对应的协议方法。在苹果的开发文档中,每个协议都有单独的页面列出所有的方法和参数。
   发表时间:2011-07-03   最后修改:2011-07-03
不好意思,I'M新手,看了些文档说,view层最好不要直接调用controller层,而是通过委托的机制,这个委托应该就想楼主说的java里的interface,现在有个没理解的东西,.m文件和.h文件,是不是.m文件属于model层,.h文件属于controller层??
0 请登录后投票
   发表时间:2011-07-05  
单对象的特定事件触发的时候,对象会调用delegate指向对象对应的协议方法。
0 请登录后投票
   发表时间:2011-07-06  
pslff 写道
不好意思,I'M新手,看了些文档说,view层最好不要直接调用controller层,而是通过委托的机制,这个委托应该就想楼主说的java里的interface,现在有个没理解的东西,.m文件和.h文件,是不是.m文件属于model层,.h文件属于controller层??


不是,m是实现,h是定义,跟h与C、CPP的关系差不多
0 请登录后投票
   发表时间:2011-07-06  
antonia 写道
单对象的特定事件触发的时候,对象会调用delegate指向对象对应的协议方法。


如果这样说会更准确:delegate的存在,是某对象行为的未知部分,并不是对象会调用delegate的某个方法,而是对象的某个方法中有一个步骤是对delegate的方法调用,这只是对象该行为中的一个步骤。
0 请登录后投票
   发表时间:2011-07-06   最后修改:2011-07-06
稍微补充一下:
delegate本身和protocol其实没有必然的联系,比如某个delegate可以不是一个protocol的对象、他可以是某个interface的object或者甚至是一个structure都可以,当然,这有悖于delegate模式的定义。

说道protocol,可以参照interface来对比一下,因为这两者的地位比较相近
从道义上来讲,interface可以看作“君子协议”,而protocol可以看作“要求严格遵守的法律”

大家写代码的时候就会发现,比如我的interface定义为某种样子,但是实质上,实现这个interface的时候完全可以不按照interface定义来做实现,这不是什么问题,只不过这样看起来我们就“有点小人了”,因为告诉别人“我长这个样子”,但是实质上“我长成了另一个样子”

protocol则不同,根据OBJ C 2.0的扩充(当然,在更早的版本中,protocol实际上跟interface木有太大区别,但是编码规范会推荐我们要“严格”遵守protocol定义),可以用@required来规定必备方案,这样就实现了与interface不同的地位:protocol定义是“法律”,这样就类似了强类型语言的接口。

但是……实质上也不是这样的……对于obj c,本身是一种动态性极强的语言蓝本,“你可以让看起来不会吃饭的花朵尝试吃饭”、“你发现狗看起来可以吃饭,但是当你喂食的时候,他因为没学会吃饭,而导致崩溃”,这是很常见的现象。所以我们只要知道interface和protocol等存在的意义即可,至于实际运用中如何,相信大家心里自然有一杆秤。
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics