協議(Protocol)
相似一個類的接口,不一樣的是協議沒有父類,也不能定義實例變量。java
只聲明,不實現。 協議只能定義公用的一套接口,但不能提供具體的實現方法。也就是說,它只告訴你要作什麼,但具體怎麼作不關心。具體的實現要在遵照這個協議的類中實現。markdown
協議能夠用
@property
形式聲明屬性,只不過只有對應的setter/getter
方法聲明,並無生成對應的成員變量ui
<NSObject>
是基協議,是最根本的協議,其中聲明瞭不少最基本的方法,如description
,retain
,release
。建議每一個新協議都要遵照NSObject協議atom
NSObject
是一個基類,是最基本的類,任何其餘類最終都要繼承它。spa
一、定義協議 可定義在單獨.h文件中,也可用定義在某個類中code
@protocol PDCustomProtocol <NSObject>
//在此聲明方法
- (void)playFootball;
@required (默認)
- (void)playBasketball;
@optional
- (void)run;
@end
複製代碼
@required
:要求遵循協議的類必須實現,不然會發出警告,但不報錯。 @optional
:不要求實現,不實現也不會有警告。orm
若是這個協議只用在某個類中,應該把協議定義在該類中對象
若是這個協議用在不少類中,就應該定義在單獨.h文件中繼承
新建Protocol文件:接口
就會生成一個.h文件
二、遵照協議 首先要#import "協議文件名.h"
或者@protocol 協議名稱
。可是使用後者時只是告訴下面代碼這是一個協議,但不知道協議裏面有什麼東西。 通常只在用到協議內容的時候在#import
。在實際開發中經常使用@protocol 協議名稱
。
@interface 類名 : 父類名 <協議名稱1, 協議名稱2>
@end
複製代碼
如:
@interface Person : NSObject <PDCustomProtocol>
@end
複製代碼
@protocol 協議名稱 <其餘協議名稱1, 其餘協議名稱2>
@end
複製代碼
定義一個變量的時候,能夠限制這個變量保存的對象遵照某個協議。若是沒有遵照協議,編譯器會警告。 類名<協議名稱> *變量名;
NSObject<MyProtocol> *aObject;
或
@property (nonatomic, strong) Dog<MyProtocol> *dog;
複製代碼
protocol能夠用於存儲方法聲明,能夠將多個類中共有的方法抽取出來,之後讓這些類遵照協議便可
繼承連同方法的實現也繼承了,而protocol只有聲明沒有實現; 相同類型的類可使用繼承,但不一樣類型的類只能使用protocol
Category
能夠給一個類擴充方法,既有申明也有實現;而Protocol
只有聲明,沒有實現。 同:Category
和Protocol
均可以聲明方法,不能聲明屬性。