天天看點

協定(Protocol)

活得快樂的最重要因素是人生有事幹、有人可去愛,以及生命中有所冀望。

協定

一. 協定基本概念

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. 委托代理的應用

  委托代理主要應用于對象之間的通信,是一種通信機制。具體應用于以下幾個經典案例:

  1. 頁面跳轉過程中資料的回調,比如頁面A -> B,B -> 過程中資料的回調;
  2. 處理事件響應,控制器中添加自定義視圖的時候,一般點選自定義視圖觸發的事件,需要委托控制器響應處理,這個時候用委托代理設計模式是一個比較好的選擇之一;
  3. 控制器瘦身,例如我們經常用到的控制器​

    ​UITableView​

    ​,我們将​

    ​UITableView​

    ​的​

    ​delegate​

    ​和​

    ​DataSource​

    ​單獨拿出來,由一個代理對象類進行控制,隻将必須控制器處理的邏輯傳遞給控制器處理。​

    ​UITableView​

    ​的資料處理、展示邏輯和簡單的邏輯互動都由代理對象去處理,和控制器相關的邏輯處理傳遞出來,交由控制器來處理,這樣控制器的工作少了很多,而且耦合度也大大降低了。這樣一來,我們隻需要将需要處理的工作交由代理對象處理,并傳入一些參數即可。
委托-代理優秀部落格推薦:​