Objective-C 碎碎念 10

本文為大地瓜原創,歡迎知識共享,轉載請注明出處。
雖然你不注明出處我也沒什么精力和你計較。
作者微信號:christgreenlaw


本節討論OC中 協議 的問題。--- Protocol

一、Overall

協議的作用:
聲明一些方法,其中可以標明是必需的(required)還是可選的(optional)。
協議的格式:

@protocol 協議名稱
//方法列表
@end

遵守協議:

@interface 類名 : 父類 <協議名稱1, 協議名稱2....>
@end

可以通過Objective-C File的模版來創建新的協議文件(.h)。
當遵守了協議后,此類就擁有了協議所有的函數聲明,可以直接進行.m的實現。

和繼承的區別

繼承之后默認就繼承了實現,不需要重寫實現了。而協議只有聲明。
相同類型,滿足is-a關系的才能繼承,否則就需要使用protocol。
protocol可以用于存儲聲明,高層次的抽象出方法。

協議注意事項

  1. 協議只能聲明方法,不能聲明屬性。(當你使用的時候才會報錯,單純的寫上屬性并不會報錯)不能寫實現。
  2. 子類會繼承父類所遵循的協議以及父類對協議的實現。(其實很好理解,子類本身就是繼承了父類所有的聲明和實現)
  3. OC中一個類可以遵循多個協議,但是只能有一個父類(單繼承)
  4. 協議可以遵守協議(此時該協議會包含其他協議的聲明)

基協議

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容