一、解析
1. 原理
在IOS中委托通过一种@protocol的方式实现,所以又称为协议.协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现.这叫好比我想买个手机,所以我有个buyIphone
方法,但是我不知道谁那买手机,所以把这个需求发布出去(比如公布在网站上),如果有卖手机的商人(也就是说他能实现buyIphone这个方法)看到,他就会接受我的委托,(在商人自己的类中实现<XXXdelegate>),那么我的委托对象就指向了这个商人..当我要买手机的时候,直接找他就行了.
委托是指给一个对象提供机会对另一个对象中的变化做出反应或者影响另一个对象的行为。其基本思想是:两个对象协同解决问题。一个对象非常普通,并且打算在广泛的情形中重用。它存储指向另一个对象(即它的委托)的引用,并在关键时刻给委托发消息。消息可能只是通知委托发生了某件事情,给委托提供机会执行额外的处理,或者消息可能要求委托提供一些关键的信息以控制所发生的事情。
2. 作用
1)委托协助对象主体完成某项操作,将需要定制化的操作通过委托对象来自定义实现,达到和子类化对象主体同样的作用。
2)事件监听,委托对象监听对象主体的某些重要事件,对事件做出具体响应或广播事件交给需要作出响应的对象。
3. 委托方法通常包括3种动词:should、will、did
- should表示一个动作发生前,通常带有返回值,可以在动作发生之前改变对象状态。
- will在动作发生前,委托可以对动作做出响应,但不带有返回值。
- did在动作发生后做出的响应。
二、实现
1. 委托类
.h文件:
@protocol MyDelegate
//委托方法
-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money;
@end
@interface My : NSObject
@property(weak,nonatomic) id<MyDelegate> delegate;//weak是防止内存引用指数增加而导致委托对象无法释放的问题
@end
.m文件:
//代码中声明了一个协议,名叫Mydelegate,在其中有一个buyIphone方法,即一个委托项。
//当我要购买手机的时候只需要通过delegate 调用BuyIphone方法即可.
//如下:
-(void)willbuy
{
[delegate buyIphone:@"iphone 4s" money:@"4888"];
}
2. 实现这一委托的类
.h文件引用并调用:
#import "My.h"
@interface Business : NSObject<MyDelegate>
@property My *my;
@end
.m文件实现委托:
//委托指向:(self或者其他实例里实现委托)
my.delegate = self;
//实现委托方法:
-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money
{
NSLog(@"手机有货,这个价钱卖你了,发货中!!");
}