Objective-C之Protocol

來源:互聯網
上載者:User

標籤:

 

Protocol 

interface是一個類的標頭檔的聲明不是真正意義上的介面的意思。protocol才是OC的介面。

作用:

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

文法格式:

@protocol 協議名 //方法的聲明列表@end
  • 類遵守協議
    • 一個類可以遵守1個或多個協議
    • 任何類只要遵守了Protocol,就相當於擁有了Protocol的所有方法聲明
@interface 類名 : 父類 <協議名稱1, 協議名稱2,…>@end

Protocol和繼承的區別:

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

協議的注意事項:

1、協議只能聲明方法,不能聲明屬性。2、父類遵守了某個協議,那麼子類也會自動遵守協議。3、OC中可以遵循多個協議,但是只能有一個父類。OC不能多繼承,但是可以多層繼承。4、協議也可以遵守其他協議,然後有一個類遵守這個協議的話,就會具備所有協議的方法聲明。5、每個新的協議都遵守NSObject的協議(建議都遵循,不遵循也沒關係)

protocol可以實現一些必須實現和選擇實現的方法。這個和java是完全不同的。

@required和@optional關鍵字

  • 協議中有2個關鍵字可以控制方法是否要實現(預設是@required,在大多數情況下,用途在於程式員之間的交流)
    • @required:這個方法必須要實現(若不實現,編譯器會發出警告)
    • @optional:這個方法不一定要實現
@protocol SportProtocol <NSObject>@required // 如果遵守協議的類不實現會警示告- (void)playFootball;@optional // 如果遵守協議的類不實現不會警示告- (void)playBasketball;@end
注意:@required和@optional僅僅使用程式員之間交流, 並不能嚴格的控制某一個遵守該協議的類必 須要實現該方法, 因為即便不是實現也不會報錯, 只會報一個警告
  • 協議的類型限制

    • 1、協議的第一個應用情境,可以將協議寫在資料類型的右邊,明確的標註如果想給該變數賦值,那麼該對象必須遵守某個協議。
    • 2、注意:類型限定是寫在資料類型的右邊的。(有點類似Java中的範型)。
    • 3、雖然在接受一個對象的時候,對這個對象進行了類型限定(限定它必須實現某個協議),但並不意味著這個對象就真正的實現了該方法,所以每次在調用對象的協議方式應該進行一次驗證。

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

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

    • 4、遵守協議,僅僅是具有協議中方法的聲明,但是沒有方法的實現,所有還需要具體的實現。

驗證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真正的匯入一個協議的聲明

Objective-C之Protocol

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.