一、理解協議與代理
協議
協議的格式:@protocol關鍵字:協議的聲明
例如
@protocol CustomAlertViewDelegate
@optional
//此關鍵字下聲明的方法,是可選實現的方法。
@required
//此關鍵字聲明的方法為,必須實現的方法,如果不實現,編譯會報警告,程序運行崩潰。
//如果沒有規定方法屬於可選還是必須實現的,默認為@required。
@end
二 代理
代理是一個抽象的概念,我如果想做一件事情,而我自己並不想做,可以讓別人幫我來做,那麼別人就是我的代理.
例如,我想租個房子,我自己比較懶,於是我想到中介加50塊錢的手續費就可以幫我找到房子,我於是給中介打電話,委托中介給我找個房子,此時中介就是我的代理,我委托他幫我找房.
這個例子中,中介就是代理,50塊錢的手續費就是協議.
1.先聲明好協議:創建協議文件
//協議聲明
@protocol ChangeColorDelegate
//方法
-(void)changeColor;
(2)那麼(A)就需要指定讓誰(委托人)去執行協議。
在A.h中聲明一個屬性 B*delegate;代表委托人(代理)是誰(B類的對象)。
id<協議> delegate;委托人可以是任何實現協議類的對象
//聲明
@protocol ChangeColorDelegate;
//指定代理對象,,
@property(nonatomic,assign)iddelegate;
(3)委托人B(代理)就需要遵守協議,並按照協議完成規定的內容。
1.B首先要實現協議 :在B.h中通過<協議名>實現協議。
//實現協議,此時別忘了導入頭文件
@interface ZYFirstViewController : UIViewController
2.需要在B.m中設置代理: a.delegate = self. (self指B類的對象)
// 指定代理
second.delegate=self;
3.實現協議方法。
//實現協議方法
-(void)changeColor { self.view.backgroundColor=[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1.0]; [self.navigationController popViewControllerAnimated:YES]; }
4.指定代理在什麼情況下執行協議方法。
// 指定在什麼條件下執行
[_delegate changeColor];
三 代理設計模式的基本思想:兩個對象協同解決問題,通過代理實現對象與對象之間的通信。
實質:通過傳遞對象,調用方法。
注意:協議本身不是類,沒有父類並且不能定義實例變量,只是對方法的聲明,不進行方法的實現;
協議用於專門聲明被別的類實現的方法,方法功能更靈活。