iOS 協議Protocol

概述

協議(Protocol)相似一個類的接口,不一樣的是協議沒有父類,也不能定義實例變量。java

只聲明,不實現。 協議只能定義公用的一套接口,但不能提供具體的實現方法。也就是說,它只告訴你要作什麼,但具體怎麼作不關心。具體的實現要在遵照這個協議的類中實現。markdown

基本做用

  • 聲明若干個方法(不能聲明成員變量)
  • 只要某個類遵照了這個協議,就擁有了該協議中的全部方法聲明,類對象 可直接調用方法
  • 只要父類遵照了某個協議,其子類也跟着遵照
  • 和java中的「接口」很類似,但功能更豐富
  • 一個類能夠遵循多個協議
  • 協議能夠遵照協議。一個協議遵照了另外一個協議,就能夠擁有另外一份協議中的方法聲明

協議能夠用@property形式聲明屬性,只不過只有對應的setter/getter方法聲明,並無生成對應的成員變量ui

基協議

<NSObject>是基協議,是最根本的協議,其中聲明瞭不少最基本的方法,如descriptionretainrelease。建議每一個新協議都要遵照NSObject協議atom

NSObject是一個基類,是最基本的類,任何其餘類最終都要繼承它。spa

使用

一、定義協議 可定義在單獨.h文件中,也可用定義在某個類中code

@protocol PDCustomProtocol <NSObject>

//在此聲明方法
- (void)playFootball;

@required (默認)
- (void)playBasketball;

@optional
- (void)run;

@end
複製代碼
  • 修飾方法的關鍵字

@required :要求遵循協議的類必須實現,不然會發出警告,但不報錯。 @optional :不要求實現,不實現也不會有警告。orm

若是這個協議只用在某個類中,應該把協議定義在該類中對象

若是這個協議用在不少類中,就應該定義在單獨.h文件中繼承

新建Protocol文件:接口

image.png image.png 就會生成一個.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只有聲明沒有實現; 相同類型的類可使用繼承,但不一樣類型的類只能使用protocol

Protocol與Category的區別

Category能夠給一個類擴充方法,既有申明也有實現;而Protocol只有聲明,沒有實現。 同:CategoryProtocol均可以聲明方法,不能聲明屬性。

相關文章
相關標籤/搜索