代理模式一般用於解決相似這樣的問題:咱們經過界面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中實現,不然會報錯。