代理模式一般用于解决相似这样的问题:咱们经过界面A打开了界面B,但在应用进行的过程当中,界面B有时候也须要和A主动联络,好比点击某个按钮时。一个比较好的办法是,让A成为B的代理,这样B就能够在须要的时候给A发送消息了。ide
代理模式的一个好处是,B实际上不须要了解A的任何事情,只要知道A是本身的代理就能够了。在这种模式下,B依然独立与A,实现了松耦合。atom
对象A是对象B的代理,对象B须要向A发送消息,设置方法分四步:spa
一、在对象B的.h中定义一个protocol代理协议,并声明一个协议的属性变量代理
二、让对象B在适当的时候向代理对象A发送消息,好比触发按钮时。code
三、让对象A听从代理协议对象
四、通知对象B,如今A是它的代理blog
分步说明:io
一、在B.h中定义代理协议和属性变量class
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
二、在B.m中实现B向A发送消息的方法,以按下done按钮为例:import
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
三、让A听从代理协议,在A.h的@interface声明中增添一个尖括号便可
1 /*****A.h*****/ 2 3 @interface A<BDelegate> 4 5 @end
四、通知对象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中实现,不然会报错。