Objective-C:代理

說到Objective-C的代理,就不得不先講一下協議——@protocolui

什麼是協議 - protocol

協議,顧名思義,就是要所要遵循的一些規則。在協議中聲明一組方法,在須要的時候實現具體操做。在Foundation.framework下的NSObject類中,就有一個NSCopying協議的聲明。atom

@protocol NSCopying <NSObject>
- (id)copyWithZone:(NSZone *)zone;

當一個類須要使用- (id)copy的時候,就必需要遵循這個NSCopying協議,實現- (id)copyWithZone:方法。.net

再舉個栗子。全部的人都要吃飯睡覺。這時,咱們能夠在定義一個頭文件BasicBehavior.h,聲明BasicBehavior協議,並聲明吃飯和睡覺這兩個動做的方法。代理

#import <Foundation/Foundation.h>
@protocol BasicBehavior <NSObject>
@required
- (void)eat;
@optional
- (void)sleep;

這裏的@required@optional代表它們遵循這個協議時下面的這些方法是否必須實現。缺省值是@requiredcode

以後,在定義類的時候,只要遵循BasicBehavior協議,就能夠重寫協議中聲明的方法,在不一樣的類中實現不一樣的操做。若是@required標記下的方法沒有所有實現,編譯器會警告。對象

#import <Foundation/Foundation.h>
@interface Student : NSObject <BasicBehavior>
- (void)study;
@end

這樣就代表Student類遵循BasicBehavior協議,它必須實現- (void)eat;方法。blog

這裏的用法其實和單繼承是相似的。可是,協議能夠實現多繼承機制,讓一個類同時遵循多個協議就能夠實現多個協議中聲明的方法。在Objective-C中,多繼承是不被容許的繼承

代理模式 - protocol和delegate的結合

其實,在iOS開發中,協議更多的是配合代理使用。開發

UIKit.framework下的UITableView就是一個很好的栗子。在UITableView.h中,聲明瞭一個delegate屬性和UITableViewDelegate協議。文檔

@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;
@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
//具體有哪些方法這裏就不一一列出了,查閱官方文檔便可。
@end

屬性的聲明語句中,id是一個動態類型,能夠表示Objective-C中全部的對象類型,後面<>內的協議名稱用來約束使用delegate屬性的類必需要遵循UITableViewDelegate協議。

當咱們使用UITableView繪製界面時,須要給UITableView的實例的delegate屬性賦值。一般狀況下,在一個ViewController中是這樣寫的。

self.tableView.delegate = self;

以後能夠

  • 實現- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;,告訴UITableView每個Cell的高度是多少;

  • 實現- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;,告訴UITableView當Cell被點擊後須要作什麼。
    UITableViewDelegate方法有不少。UITableView這個類不須要知曉這些方法是怎麼實現的,實現的過程由咱們來告訴他。而後UITableView就會幫助咱們顯示出咱們實現的效果。

我以爲代理和現實生活中找中介是同樣的。我想去買一套房子,找到中介後,把這個任務交給他,具體如何去購買,是他須要考慮的事情,我只須要等待結果就行了。

在上面的栗子中,delegate就是中介,UITableViewDelegate就是我和中介之間的協定,- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;方法的實現就比如中介買房的過程。最後繪製tableView就是我獲得買房結果後須要作什麼事情。

PS:第一次寫邏輯性比較強的文章,有錯誤的地方歡迎你們指正。在此謝過。

參考文章:
cobish的1四、OC —— Protocol

相關文章
相關標籤/搜索