------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