您的位置:首页 > 其它

深入理解iphone开发中的delegate

2012-06-21 10:36 351 查看
先举一个例子:

假如"我"的本职工作之一是“接电话”,但"我"发现太忙了或来电太杂了,于是我聘请一位"秘书"分担我“接电话”的工作,如果电话是老板打来的,就让“秘书”将电话转接给“我”。。。

那么,“我”就是A Object. “秘书”就是"我"的“Delegate”。写成代码就是 -- [我 setDelegate:秘书];

delegate的概念出现与mvc(model-view-controller),protocol,单线继承密切相关

The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.

Cocoa 中处理事件的方式有几种,其中一种是你可以重载类中的对应的事件处理方法,比如MouseDown事件在NSResponse类中就被方法mouseDown:处理,所以所有继承自NSResponse的类都可以重载 mouseDown:方法来实现对MouseDown事件的处理。

另外一种处理方式就是使用Delegate,当一个对象接受到某个事件 或者通知的时候,会向它的Delegate对象查询它是否能够响应这个事件或者通知,如果可以这个对象就会给它的Delegate对象发送一个消息(执行一个方法调用)

协议 Protocol :

我说下我的理解。object-c 里没有多继承。那么又要避免做出一个对象什么都会(super class monster,huge ,super,waste)一个超能对象本身是否定了面向对象的概念和真谛了。为了让代码更简洁,条理更清楚,可以将部分职责分离。

协议本身没有具体的实现。只规定了一些可以被其它类实现的接口。

view plaincopy to clipboardprint?

@protocal UITextFieldDelegate
-(BOOL) textFieldShouldReturn:(UITextField *) textField ;
@end


delegate 总是被定义为 assign @property

view plaincopy to clipboardprint?

@interface UITextField
@property (assign) id<UITextFieldDelegate> delegate;
@end


这样我们就在UITextField内部声明一个委托(delegate),那么就需要委托的代理实现UITextFieldDelegate 中约定的行为

view plaincopy to clipboardprint?

// 首先, 在接口里边声明要使用谁的Delegate
@interface delegateSampleViewController : UIViewController
<UITextFieldDelegate> {}
@end

// 然后在实现文件中初始化的时候, 设置Delegate为self(自己)
@implementation delegateSampleViewController

// ....
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
textField.delegate = self;//设置当前的控制器为UITextField的代理,相当于注册(指定)代理人
[textField becomeFirstResponder];
[cell.contentView addSubview:textField];
[textField release];
// ....

}

// 实现UITextFieldDelegate中约定的行为
#pragma mark UITextFieldDelegate Method
// called when 'return' key pressed. return NO to ignore.
- (BOOL)textFieldShouldReturn:(UITextField *)textField {

[textField resignFirstResponder];
return YES;
}


Delegate and Protocol

我们通过发送消息给对象出发特定动作;对象发送某些变化的时候通过回调函数(callback)通知我们。对象在特定事件发生的时候,就会调用对应的回调函数,触发业务逻辑。

回调函数通过所谓的代理(Delegation)来实现.

委托(delegate)-------益处:

¨
它更为简洁的把程序的逻辑处理从UIApplication中分离了出来。

¨
它避免了程序员直接从UIApplication派生子类,试想如果通过从UIApplication派生子类的方法来管理应用程序的生命周期和系统事件是多么痛苦的一件事情。

  “委托模式”中一般有两个对象参与处理同一个请求,所谓的请求在iPhone中就是应用程序的生命周期和系统事件,接受请求的对象将请求委托给另一个对象来处理,同样在iPhone中对应的是UIApplication在接收到生命周期和系统事件后委托给UIApplicationDelegate来处理。

  iPhone不采用继承体系而采用委托模式来实现聚合的原因,其更深层次在于iPhone框架的多样化使得继承无法保证子类行为的一致性,而委托模式恰恰是为了弥补继承的这个缺点诞生的。

  每个项目都会有一个UIApplication对象来处理应用程序的生命周期和系统事件,main()函数通过UIApplicationMain()来初始化应用程序的UIApplication,如果想对应用程序的UIApplication进行操作,就只能通过[UIApplication
sharedApplication]来获取到UIApplication的引用,这个方法会返回一个全局唯一的UIApplication对象给读者。

  同样,读者可以通过如下代码获取应用程序的委托对象:UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate];

协议 Protocol :

  object-c 里没有多继承。那么又要避免做出一个对象什么都会(super class monster,huge ,super,waste)一个超能对象 本身是否定了面向对象的概念和真谛了。为了让代码更简洁,条理更清楚,可以将部分职责分离。

  协议本身没有具体的实现。只规定了一些可以被其它类实现的接口。

  delegate 总是被定义为 assign @property

@interface UITextField
@property (assign) id<UITextFieldDelegate> delegate;
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: