delegate代理(委托)的使用心得

首先,大家应该都非常清楚明白委托(代理)其实协议的一种,顾名思义,就是委托他人帮自己去做什么事,或者他人代谁去坐某事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。


>
委托一般情况做以下几件事情

>
>
传值:所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(提高代码可复制性,可移植性,和代码分块的时候经常用)

>
>
传事件:所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)

>
>
赋值:这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。


最后,我想分享一下在使用委托的时候的一些心得和注意事项。


心得:delegate的命名要准确,尽量看名字就知道用法。delegate和通知有的用法有些象,但是前者是单对单的,后者是单对多的情况。

> 命名:
> 1.协议名一般以类名开头,如( BMfirendHeaderViewDelegate)
> 2.委托的外部声明属性一般固定为delegate.(有经验的程序员一般会默认在你类名后面”.”一个delegate,如果有马上成为代理看看)
> 3.委托方法一般也以类名开头,且不加标示符.(有经验的程序员查看你的代理方法会直接成为代理后输入你的类名查看代理方法)
> 4.委托方法一般不是特殊轻快都@optional.
> 5.委托方法一般会使用should、will、did这3个关键字表面状态.
> 具体更多书写规范可以查看官方示例.
注意:在dealloc要把delegate至为nil,还有就是delegate设置属性的时候要用assign,不要用retain。





委托在IOS中委托通过一种@protocol的方式实现,所以又称为协议.协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现.这叫好比我想买个手机,所以我有个buyIphone 方法,但是我不知道谁那买手机,所以把这个需求发布出去(比如公布在网站上),如果有卖手机的商人(也就是说他能实现buyIphone这个方法)看到,他就会接受我的委托,(在商人自己的类中实现<XXXdelegate>),那么我的委托对象就指向了这个商人..当我要买手机的时候,直接找他就行了.

例如:

复制代码

@protocol MyDelegate
-(void)buyIphone:(NSString )iphoneType money:(NSString )money;

@end
@interface My : NSObject
{
id<MyDelegate> deleage;
}
@property(assign,nonatomic)id<MyDelegate> delegate;
@end

复制代码


代码中声明了一个协议 名叫Mydelegate,在其中有一个buyIphone方法,即一个委托项。当我要购买手机的时候只需要通过delegate 调用 BuyIphone方法即可.

如下:

-(void)willbuy
{
[delegate buyIphone:@”iphone 4s” money:@”4888”];

}


我不必关心谁现实了这一委托,只要实现了这个委托的类,并且buyIphone是声明的委托中必须实现的方法,那么就一定能够得到结果.

例如:商人类实现了这一委托(用<Mydelegate>表示实现)

#import <Foundation/Foundation.h>
#import “My.h”
@interface Business : NSObject<MyDelegate>

@end


然后在 @implementation Business 中调用 buyIphone方法

复制代码

#import “Business.h”

@implementation Business

-(void)buyIphone:(NSString )iphoneType money:(NSString )money
{
NSLog(@”手机有货,这个价钱卖你了,发货中!!”);
}
@end

复制代码

委托是Cocoa中最简单、最灵活的模式之一。委托是指给一个对象提供机会对另一个对象中的变化做出反应或者影响另一个对象的行为。其基本思想是:两个对象协同解决问题。一个对象非常普通,并且打算在广泛的情形中重用。它存储指向另一个对象(即它的委托)的引用,并在关键时刻给委托发消息。消息可能只是通知委托发生了某件事情,给委托提供机会执行额外的处理,或者消息可能要求委托提供一些关键的信息以控制所发生的事情。



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

should表示一个动作发生前,通常带有返回值,可以在动作发生之前改变对象状态。
will在动作发生前,委托可以对动作做出响应,但不带有返回值。
did在动作发生后做出的响应。

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

第一:委托协助对象主体完成某项操作,将需要定制化的操作通过委托对象来自定义实现,达到和子类化对象主体同样的作用。
第二:事件监听,委托对象监听对象主体的某些重要事件,对事件做出具体响应或广播事件交给需要作出响应的对象。





委托模式的实现思路:

1、通常是在对象主体包含一个委托对象的弱引用:
@interface A : NSObject
{
IBOutlet id delegate;
} -(id) delegate;
-(void) setDelegate:(id)obj;

2、委托对象的实现有两种方式:正式协议和非正式协议,对象主体在协议中定义委托方法,委托对象可以选择实现其中某些委托方法,因此如果通过正式协议定义委托方法需要使用@option。
@protocol NSSearchDelegate
@option
-(void)didSearchFinish:(NSNotification) aNotification;
@end

3、连接对象主体和委托,无非就是通过setDelegate:(id)obj来实现。

4、触发委托方法。




下面总结一下委托的步骤:

1. 创建一份协议.
@protocol BMfirendHeaderViewDelegate <NSObject>

@end


2. 申明代理属性.
@property (nonatomic, weak) id<BMfirendHeaderViewDelegate> delegate;


3. 申明代理方法
@protocol BMfirendHeaderViewDelegate <NSObject>
@optional
- (void)firendHeaderViewHeadBtnClick:(BMfirendHeaderView )firendHeaderView;
@end


4. 在委托(委托对象)设置委托代理属性(通常是某个ViewController原因作为委托)
headerView.delegate =self;


5. 遵守协议
@interface ViewController ()<BMfirendHeaderViewDelegate>


6. 实现代理方法
-(void)firendHeaderViewHeadBtnClick:(BMfirendHeaderView *)firendHeaderView
{

}