Objective-C之Protocol

 

Protocol

 

interface是一個類的頭文件的聲明不是真正意義上的接口的意思。protocol纔是OC的接口。java

做用:程序員

用來聲明一些方法
也就是說,一個prtocol是由一系列方法聲明組成的。

語法格式:web

@protocol 協議名 
//方法的聲明列表
@end
  • 類遵照協議
    • 一個類能夠遵照1個或多個協議
    • 任何類只要遵照了Protocol,就至關於擁有了Protocol的全部方法聲明
@interface 類名 : 父類 <協議名稱1, 協議名稱2,…>
@end

Protocol和繼承的區別:安全

  • 繼承以後默認就有實現, 而protocol只有聲明沒有實現
  • 相同類型的類可使用繼承, 可是不一樣類型的類只能使用protocol
  • protocol能夠用於存儲方法的聲明, 能夠將多個類中共同的方法抽取出來, 之後讓這些類遵照協議便可

協議的注意事項:ide

一、協議只能聲明方法,不能聲明屬性。
二、父類遵照了某個協議,那麼子類也會自動遵照協議。
三、OC中能夠遵循多個協議,可是隻能有一個父類。OC不能多繼承,可是能夠多層繼承。
四、協議也能夠遵照其餘協議,而後有一個類遵照這個協議的話,就會具有全部協議的方法聲明。
五、每一個新的協議都遵照NSObject的協議(建議都遵循,不遵循也不要緊)

protocol能夠實現一些必須實現和選擇實現的方法。這個和java是徹底不一樣的。ui

@required和@optional關鍵字url

  • 協議中有2個關鍵字能夠控制方法是否要實現(默認是@required,在大多數狀況下,用途在於程序員之間的交流)
    • @required:這個方法必需要實現(若不實現,編譯器會發出警告)
    • @optional:這個方法不必定要實現
@protocol SportProtocol <NSObject>

@required // 若是遵照協議的類不實現會報警告
- (void)playFootball;
@optional // 若是遵照協議的類不實現不會報警告
- (void)playBasketball;
@end
注意:@required和@optional僅僅使用程序員之間交流, 
並不能嚴格的控制某一個遵照該協議的類必 需要實現該方法, 
由於即使不是實現也不會報錯, 只會報一個警告
  • 協議的類型限制spa

    • 一、協議的第一個應用場景,能夠將協議寫在數據類型的右邊,明確的標註若是想給該變量賦值,那麼該對象必須遵照某個協議。
    • 二、注意:類型限定是寫在數據類型的右邊的。(有點相似Java中的範型)。
    • 三、雖然在接受一個對象的時候,對這個對象進行了類型限定(限定它必須實現某個協議),但並不意味着這個對象就真正的實現了該方法,因此每次在調用對象的協議方式應該進行一次驗證。3d

      • 可使用"respondsToSelector:@selector(方法名)"對 這個遵循協議的對象的方法在被調用的時候進行安全驗證 例如:
      • wife這個類遵循了一個協議,並實現了須要的方法,而後在Person類中有一個wife對象屬性,並在Person本身的方法中調用wife的屬性[self.wife cooking],這裏就須要驗證wife的方法是否實現了協議的方法。(看下面的代碼)代理

      • 這麼作也是用於程序員之間溝通的。這樣可使得第二個個程序員和第一個程序員開發的代碼在協議上很好的發現須要遵循協議並須要實現的地方。

    • 四、遵照協議,僅僅是具備協議中方法的聲明,可是沒有方法的實現,全部還須要具體的實現。

驗證wife的方法是否實現了協議的方法。
if([self.wife respondsToSelector:@selector:(cooking)]){
    [self.wife cooking];
}
if([self.wife respondsToSelector:@selector:(washing)]){
    [self.wife washing];
}
if([self.wife respondsToSelector:@selector:(job)]){
    [self.wife job];
}

協議的編寫規範: 1.通常狀況下, 當前協議屬於誰, 咱們就將協議定義到誰的頭文件中 2.協議的名稱通常以它屬於的那個類的類名開頭, 後面跟上protocol或者delegate 3.協議中的方法名稱通常以協議的名稱protocol以前的做爲開頭 4.通常狀況下協議中的方法會將觸發該協議的對象傳遞出去

5.通常狀況下一個類中的代理屬於的名稱叫作 delegate

6.當某一個類要成爲另一個類的代理的時候, 通常狀況下在.h中用@protocol 協議名稱;告訴當前類 這是一個協議. 在.m中用#import真正的導入一個協議的聲明

相關文章
相關標籤/搜索