本文為大地瓜原創,歡迎知識共享,轉載請注明出處。
雖然你不注明出處我也沒什么精力和你計較。
作者微信號:christgreenlaw
本節討論OC中 協議 的問題。--- Protocol
一、Overall
協議的作用:
聲明一些方法,其中可以標明是必需的(required)還是可選的(optional)。
協議的格式:
@protocol 協議名稱
//方法列表
@end
遵守協議:
@interface 類名 : 父類 <協議名稱1, 協議名稱2....>
@end
可以通過Objective-C File的模版來創建新的協議文件(.h)。
當遵守了協議后,此類就擁有了協議所有的函數聲明,可以直接進行.m的實現。
和繼承的區別
繼承之后默認就繼承了實現,不需要重寫實現了。而協議只有聲明。
相同類型,滿足is-a關系的才能繼承,否則就需要使用protocol。
protocol可以用于存儲聲明,高層次的抽象出方法。
協議注意事項
- 協議只能聲明方法,不能聲明屬性。(當你使用的時候才會報錯,單純的寫上屬性并不會報錯)不能寫實現。
- 子類會繼承父類所遵循的協議以及父類對協議的實現。(其實很好理解,子類本身就是繼承了父類所有的聲明和實現)
- OC中一個類可以遵循多個協議,但是只能有一個父類(單繼承)
- 協議可以遵守協議(此時該協議會包含其他協議的聲明)
基協議
NSObject是一個基類,同名協議是基協議。
建議每個協議都遵守NSObject協議。但其實只要你從NSObject基類繼承了,就已經遵守了基協議了。
@required 和 @optional 關鍵字
@required是必須實現的,你不實現將會報警告
@optional是可選實現的,不實現不會報警告
如果沒有使用關鍵字修飾協議中的方法,那么方法默認是required的。
注意:required的方法如果你不實現,只會報警告,并不會報錯誤。也就是說,它只起到人的交流作用,并不能對程序進行任何限制。
二、協議的應用場景
protocol類型限制
要求對象必須具備某些行為。
形如:
Person<PersonProtocol> *p = [[Person alloc]init];
那么此時賦值時,該對象必須遵守PersonProtocol。否則會報警告。
類型限定寫在類名的右邊。
雖然進行了類型限定,但并不代表它就實現了這個方法。(協議是可以只寫遵守而不進行實現的)這里比較坑,嚴謹的做法是判斷其能不能響應該方法。(respondsToSelector)
代理設計模式
- 當對象A發生一些行為,想告知B對象
- 對象B想監聽對象A的一些行為
- 當對象A無法處理某些行為,想讓B對象幫忙處理
以上就讓B對象成為A對象的代理
三、協議的編寫規范
- 協議屬于誰,就寫在誰的頭文件里
- 協議的名稱一般就是類名加上protocol或者delegate
- 協議中的方法一般以類名(protocol之前的部分)開頭
- 一般來說,協議中的方法會把觸發該協議的對象以參數的形式傳遞到方法內
- 在.h中使用@protocol,在.m中使用真正的import