概述
協(xié)議(Protocol)
類似一個(gè)類的接口怀伦,不同的是協(xié)議沒有父類,也不能定義實(shí)例變量山林。
只聲明房待,不實(shí)現(xiàn)。
協(xié)議只能定義公用的一套接口,但不能提供具體的實(shí)現(xiàn)方法桑孩。也就是說拜鹤,它只告訴你要做什么,但具體怎么做不關(guān)心流椒。具體的實(shí)現(xiàn)要在遵守這個(gè)協(xié)議的類中實(shí)現(xiàn)敏簿。
基本作用
- 聲明若干個(gè)方法(不能聲明成員變量)
- 只要某個(gè)類遵守了這個(gè)協(xié)議,就擁有了該協(xié)議中的所有方法聲明宣虾,類對象 可直接調(diào)用方法
- 只要父類遵守了某個(gè)協(xié)議惯裕,其子類也跟著遵守
- 和java中的“接口”很相似,但功能更豐富
- 一個(gè)類可以遵循多個(gè)協(xié)議
- 協(xié)議可以遵守協(xié)議绣硝。一個(gè)協(xié)議遵守了另一個(gè)協(xié)議轻猖,就可以擁有另一份協(xié)議中的方法聲明
協(xié)議可以用
@property
形式聲明屬性,只不過只有對應(yīng)的setter/getter
方法聲明域那,并沒有生成對應(yīng)的成員變量
基協(xié)議
<NSObject>
是基協(xié)議咙边,是最根本的協(xié)議,其中聲明了很多最基本的方法次员,如description
败许,retain
,release
淑蔚。建議每個(gè)新協(xié)議都要遵守NSObject協(xié)議
NSObject
是一個(gè)基類市殷,是最基本的類,任何其他類最終都要繼承它刹衫。
使用
1醋寝、定義協(xié)議
可定義在單獨(dú).h文件中,也可用定義在某個(gè)類中
@protocol PDCustomProtocol <NSObject>
//在此聲明方法
- (void)playFootball;
@required (默認(rèn))
- (void)playBasketball;
@optional
- (void)run;
@end
- 修飾方法的關(guān)鍵字
@required
:要求遵循協(xié)議的類必須實(shí)現(xiàn)带迟,否則會發(fā)出警告音羞,但不報(bào)錯(cuò)。
@optional
:不要求實(shí)現(xiàn)仓犬,不實(shí)現(xiàn)也不會有警告嗅绰。
如果這個(gè)協(xié)議只用在某個(gè)類中,應(yīng)該把協(xié)議定義在該類中
如果這個(gè)協(xié)議用在很多類中搀继,就應(yīng)該定義在單獨(dú).h文件中
新建Protocol文件:
image.png
image.png
就會生成一個(gè).h文件
2窘面、遵守協(xié)議
首先要#import "協(xié)議文件名.h"
或者@protocol 協(xié)議名稱
。但是使用后者時(shí)只是告訴下面代碼這是一個(gè)協(xié)議叽躯,但不知道協(xié)議里面有什么東西财边。
一般只在用到協(xié)議內(nèi)容的時(shí)候在#import
。在實(shí)際開發(fā)中常用@protocol 協(xié)議名稱
点骑。
- 類遵守協(xié)議
@interface 類名 : 父類名 <協(xié)議名稱1, 協(xié)議名稱2>
@end
如:
@interface Person : NSObject <PDCustomProtocol>
@end
- 協(xié)議遵守協(xié)議
@protocol 協(xié)議名稱 <其他協(xié)議名稱1, 其他協(xié)議名稱2>
@end
- 限制對象遵守某個(gè)協(xié)議
定義一個(gè)變量的時(shí)候酣难,可以限制這個(gè)變量保存的對象遵守某個(gè)協(xié)議们童。如果沒有遵守協(xié)議,編譯器會警告鲸鹦。
類名<協(xié)議名稱> *變量名;
NSObject<MyProtocol> *aObject;
或
@property (nonatomic, strong) Dog<MyProtocol> *dog;
應(yīng)用
protocol可以用于存儲方法聲明慧库,可以將多個(gè)類中共有的方法抽取出來,以后讓這些類遵守協(xié)議即可
Protocol與繼承的區(qū)別
繼承連同方法的實(shí)現(xiàn)也繼承了馋嗜,而protocol只有聲明沒有實(shí)現(xiàn)齐板;
相同類型的類可以使用繼承,但不同類型的類只能使用protocol
Protocol與Category的區(qū)別
Category
可以給一個(gè)類擴(kuò)充方法葛菇,既有申明也有實(shí)現(xiàn)甘磨;而Protocol
只有聲明,沒有實(shí)現(xiàn)眯停。
同:Category
和Protocol
都可以聲明方法济舆,不能聲明屬性。