活得快樂的最重要因素是人生有事干、有人可去愛,以及生命中有所冀望。
協議
一. 協議基本概念
1. 協議的理解
iOS里面協議不是類,它是一種約定。協議約定了一套行為規范,並且約定了那些是必須要遵守的規范,那些是可准守可不遵守的規范。但是具有的實施(也就是實現),是由遵循該協議的類來實現,所以協議只有.h文件。
基於以上概念我們應該明白對於協議的理解,以前很多的開發者依舊保留在委托-代理
等於協議
等認知上。然而前者依賴於后者的實現,而后者即便不通過前者也能完成抽象解耦的工作。
2. 協議的定義形式
協議的定義是以@protocol
開頭, + 協議的名字 <>(表示服從的協議),服從的協議寫在<>之內,多個協議之間通過逗號來進行分隔,父協議中的內容就相當於子協議也具有這些內容,以@end結束。
@protocol CustomProtocol <NSObject>
// 聲明相關方法,也就是協議內容
- (void)customProtocolMethod;
@end
二. 協議的應用
1. 委托-代理模式中的應用
開發中我們幾乎都會寫的代碼一定是UITableView
系列的代理和數據源方法。毫無疑問,蘋果提供的這個視圖是如此的優雅而強大,即便在現在這個數據源方法因代碼過多被瘋狂吐槽的年代,你依然無法想到其他實現UITableView
的更佳實踐,這個控件充分向我們展示了委托-代理
的強大。
協議最簡單直觀的應用是在委托-代理
設計模式中的應用,在封裝自定義控件的時候,我喜歡使用自定義的協議來完成用戶點擊等業務處理。個人認為,如果你想要了解代理
這一模式,起碼要自定義過自己的代理協議:
// 定義相關協議
@protocol CustomViewDelegate <NSObject>
@required
- (void)customControl: (UIView *)customView didSelectItemAtIndex: (NSUInteger)index;
@end
// .h文件
@interface CustomView : UIView
// 通過屬性來設置代理對象
@property(nonatomic, weak)id<CustomViewDelegate> delegate;
@end
// .m文件
@implementation CustomView
- (void)clickItem: (UIButton *)item
{
// 判斷代理對象是否實現了某個協議方法
if ([_delegate respondsToSelector:@selector(customControl:didSelectItemAtIndex:)]) {
[_delegate customControl:self didSelectItemAtIndex:item.tag];
}
}
@end
// 代理類此處省略...
// 我們可以通過以下方法判斷該對象是否引入相關協議
if([_delegate conformToProtocol:@protocol (CustomViewDelegate)]){
//TODO:
}
對於項目開發而言,代理這種回調機制的好處包括不僅於接口目的性強、易於追溯調試等。
三. 委托-代理
1. 委托代理的理解
上面我們提到過委托-代理的使用,那么接下來我們詳細理解下委托-代理。
代理,又稱委托代理(delegate),是iOS中常用的設計一種模式。顧名思義,它是把某個對象要做的事情委托給別的對象去做。那么別的對象就是這個對象的代理,代替它來打理要做的事。反映到程序中, 首先要明確一個對象的委托方是哪個對象,委托所做的內容是什么。在iOS程序設計中,委托通過一種@protocol的方式實現,所以又稱為協議。在iOS的SDK里面,UITableView、UITextField等都有用到這種設計模式。
協議,是多個類共享的一個方法列表,在協議中所列出的方法沒有響應的實現,由其它類來實現。委托是指給一個對象提供機會對另一對象中的變化做出反應或者相應另一個對象的行為。其基本思想是協同解決問題。
代理是一個概念,很難用一個名詞去定義(如我們可以說協議其實就是一個方法列表)。它更像是一種關系,我要做某一個事情,但我自己不想去做這件事,我委托其他人幫我去做這件事。這個時候,這位其他人就是我的代理。
2. 委托代理的應用
委托代理主要應用於對象之間的通信,是一種通信機制。具體應用於以下幾個經典案例:
- 頁面跳轉過程中數據的回調,比如頁面A -> B,B -> 過程中數據的回調;
- 處理事件響應,控制器中添加自定義視圖的時候,一般點擊自定義視圖觸發的事件,需要委托控制器響應處理,這個時候用委托代理設計模式是一個比較好的選擇之一;
- 控制器瘦身,例如我們經常用到的控制器
UITableView
,我們將UITableView
的delegate
和DataSource
單獨拿出來,由一個代理對象類進行控制,只將必須控制器處理的邏輯傳遞給控制器處理。UITableView
的數據處理、展示邏輯和簡單的邏輯交互都由代理對象去處理,和控制器相關的邏輯處理傳遞出來,交由控制器來處理,這樣控制器的工作少了很多,而且耦合度也大大降低了。這樣一來,我們只需要將需要處理的工作交由代理對象處理,並傳入一些參數即可。
委托-代理優秀博客推薦:https://segmentfault.com/a/1190000019569138