說到Objective-C的代理,就不得不先講一下協議——@protocol
。ui
協議,顧名思義,就是要所要遵循的一些規則。在協議中聲明一組方法,在須要的時候實現具體操做。在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
代表它們遵循這個協議時下面的這些方法是否必須實現。缺省值是@required
。code
以後,在定義類的時候,只要遵循BasicBehavior
協議,就能夠重寫協議中聲明的方法,在不一樣的類中實現不一樣的操做。若是@required
標記下的方法沒有所有實現,編譯器會警告。對象
#import <Foundation/Foundation.h> @interface Student : NSObject <BasicBehavior> - (void)study; @end
這樣就代表Student
類遵循BasicBehavior
協議,它必須實現- (void)eat;
方法。blog
這裏的用法其實和單繼承是相似的。可是,協議能夠實現多繼承機制,讓一個類同時遵循多個協議就能夠實現多個協議中聲明的方法。在Objective-C中,多繼承是不被容許的
。繼承
其實,在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