天天看點

黑馬程式員___OC__protocol和categoryprotocol 和category

------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------

protocol 和category

category(分類)

當想在某個類的基礎上再增加一些方法,但是不能改變原來類的内容,這個時候就可以用到分類

建立分類的格式是:原來類名+分類的别名.h(.m)

 使用注意:

 1.分類隻能增加方法,不能增加成員變量

 2.分類方法實作中可以通路原來類中聲明的成員變量

 3.分類可以重新實作原來類中的方法,但是會覆寫掉原來的方法,會導緻原來的方法沒法再使用

 4.當一個方法分類和原來都有實作的時候,調用的時候是由順序的

方法調用的優先級:分類(最後參與編譯的分類優先) --> 原來類  --> 父類

protocol(協定)

使用場合

有時候我們在寫一個類的方法的時候,如果要用到另外一個類的方法,未來避免我們再去花心思寫,我們就可以讓那個類遵守一個協定,當自己寫的類也遵守那個協定的時候,就可以使用我們想要的方法聲明了,協定就像一個方法聲明的共享平台

 1.協定的定義

 @protocol 協定名稱 <NSObject>

  // 方法聲明清單....

 @end

 2.如何遵守協定

 1> 類遵守協定

 @interface 類名 : 父類名 <協定名稱1, 協定名稱2>

 @end

 2> 協定遵守協定

 @protocol 協定名稱 <其他協定名稱1, 其他協定名稱2>

 @end

 3.協定中方法聲明的關鍵字

 1> @required (預設)

   要求實作,如果沒有實作,會發出警告

 2> @optional

   不要求實作,怎樣不會有警告

 4.定義一個變量的時候,限制這個變量儲存的對象遵守某個協定

 類名<協定名稱> *變量名;

 id<協定名稱> 變量名;

 NSObject<MyProtocol> *obj;

 id<MyProtocol> obj2;

 如果沒有遵守對應的協定,編譯器會警告

 [email protected]中聲明的屬性也可用做一個遵守協定的限制

 @property (nonatomic, strong) 類名<協定名稱> *屬性名;

 @property (nonatomic, strong) id<協定名稱> 屬性名;

 @property (nonatomic, strong) Dog<MyProtocol> *dog;

 @property (nonatomic, strong) id<MyProtocol> dog2;

 6.協定可用定義在單獨.h檔案中,也可用定義在某個類中

 1> 如果這個協定隻用在某個類中,應該把協定定義在該類中

 2> 如果這個協定用在很多類中,就應該定義在單獨檔案中

 7.分類可用定義在單獨.h和.m檔案中,也可用定義在原來類中

 1> 一般情況下,都是定義在單獨檔案

 2> 定義在原來類中的分類

協定的應用:代理模式

就像前面所說的利用協定這個方法聲明的平台,可以設計一些代理模式,使我們實際操作中有一個很明确的分工,友善團隊的協作,代理模式還有一個好處是,降低了原來的類和代理的耦合性。

轉載于:https://www.cnblogs.com/jia694600474/p/4009766.html