代理模式通常用于解决类似这样的问题:我们通过界面A打开了界面B,但在应用进行的过程中,界面B有时候也需要和A主动联络,比如点击某个按钮时。一个比较好的办法是,让A成为B的代理,这样B就可以在需要的时候给A发送消息了。
代理模式的一个好处是,B实际上不需要了解A的任何事情,只要知道A是自己的代理就可以了。在这种模式下,B依然独立与A,实现了松耦合。
对象A是对象B的代理,对象B需要向A发送消息,设置方法分四步:
1、在对象B的.h中定义一个protocol代理协议,并声明一个协议的属性变量
2、让对象B在适当的时候向代理对象A发送消息,比如触发按钮时。
3、让对象A遵从代理协议
4、通知对象B,现在A是它的代理
分步说明:
1、在B.h中定义代理协议和属性变量
1 /*****B.h*****/ 2 3 @protocol BDelegate<NSObject> 4 5 - (void) degegateMethod:(instanceType)instance; 6 7 @end 8 9 @interface B 10 11 @property(weak,nonatomic) id<BDelegate> delegate; 12 13 @end
2、在B.m中实现B向A发送消息的方法,以按下done按钮为例:
1 /*****B.m******/ 2 3 #import "B.h" 4 5 @interface B() 6 7 @end 8 9 @implementation B 10 11 - (IBAction)done:(id)sender{ 12 [self.delegate delegateMethod:instance]; 13 } 14 15 @end
3、让A遵从代理协议,在A.h的@interface声明中增添一个尖括号即可
1 /*****A.h*****/ 2 3 @interface A<BDelegate> 4 5 @end
4、通知对象B,A已经成为它的代理。在A.m中实现代理方法即可
1 /*****A.m*****/ 2 3 #import "A.h" 4 5 @interface A() 6 7 @end 8 9 @implementation A 10 11 - (void)delegateIdentifierMethod:(B *)b{ 12 //do something; 13 B.delegate=self; //identify the delegate of B is A 14 } 15 16 - (void)delegateMethod:(instanceType)instance{ 17 //do something 18 } 19 20 @end
需要注意的是,在B.h中声明的代理方法delegateMethod需要在A.m中实现,否则会报错。