黑馬程式設計師 OC基礎10 Protocol協議

2021-06-21 11:19:22 字數 2881 閱讀 1686

---------------------- asp.net+unity開發、.net培訓、期待與您交流! ----------------------

一、概念

協議類似於介面,用來宣告方法,乙個類遵守了協議,就等於擁有了這個協議中所有方法的宣告

二、作用

在**模式中經常用來規定物件必須具有的某些行為

三、使用方法

1、協議只有宣告沒有實現,所以只有.h檔案,使用@protocol關鍵字進行宣告

2、協議中的方法分兩種:

1>用@required關鍵字修飾的方法,遵守協議的類必須進行實現(預設)

2>用@optional關鍵字修飾的方法,遵守協議的類可選擇進行實現

@protocol myprotocol  // 宣告乙份協議,且這份協議遵守基協議nsobject

@required

- (void)test1;

@optional

- (void)test2;

@end

3、定義乙個變數的時候,限制這個變數儲存的物件遵守某個協議

1> 類名《協議名稱》 *變數名;

nsobject*obj;

2> id《協議名稱》 變數名;

idobj2;
3> 在@property中宣告的屬性也可用做乙個遵守協議的限制

① @property (nonatomic, strong) 類名《協議名稱》*屬性名;

@property (nonatomic, strong)dog*dog;
② @property (nonatomic, strong) id《協議名稱》屬性名;

@property (nonatomic, strong)iddog2;

4、協議也可以遵守其他協議

1> 遵守其他多個協議以逗號隔開

@protocol myprotocol2

2> 基協議

nsobject是最基本的協議,定義了description之類的基礎方法,建議遵守!

3> 當乙個協議遵守了其他協議時,就相當於擁有了其他協議的方法。

四、注意點

1、父類遵守了某個協議,相當於子類也遵守(因為子類繼承了父類的所有成員變數及方法)

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

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

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

3、跟分模擬較

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

2> 但一般情況下,分類都是定義在單獨檔案(其目的就是為了在不更改原始類的基礎上擴充方法)

3> 定義在原來類中的分類,只要求能看懂語法(語法可行)

4、協議引用

1> 在類的宣告中遵守某份協議,可以不用#import該協議,只需@協議名稱即可(為了效能考慮,可提高編譯效率)

在類的實現中再#import協議。(因為宣告中只需要知道這是乙個協議,實現中才需要知道協議中具體有哪些方法)

2> 組合方式也可在宣告中@類名,實現中#import類,

五、**模式

設計乙個**類,幫助person類完成買票功能

1、person類宣告

#import @protocol ticketdelegate;

@inte***ce person : nsobject- (void) buyticket;

// 擁有乙個**屬性

@property (nonatomic, strong) iddelegate;// id代表**的類名隨便,但必須遵守ticketdelegate協議

@end

2、person類實現

#import "person.h"

#import "ticketdelegate.h"

@implementation person

// 買電影票

- (void)buyticket

@end

3、協議宣告

#import // 宣告一些方法

@protocol ticketdelegate // 返回票價

- (double) ticketprice;

// 還剩多少張票

- (int) leftticketsnumber;

@end

4、**類

//宣告

#import @protocol ticketdelegate;

@inte***ce nextagent : nsobject@end

//實現

#import "nextagent.h"

#import "ticketdelegate.h"

@implementation nextagent

- (double)ticketprice

- (int)leftticketsnumber

@end

5、主函式呼叫

#import #import "person.h"

#import "agent.h"

#import "nextagent.h"

int main()

---------------------- asp.net+unity開發、.net培訓、期待與您交流! ----------------------詳細請檢視:www.itheima.com

黑馬程式設計師 OC基礎

asp.net unity開發 net培訓 期待與您交流!1.import的用途 1 跟 include一樣,拷貝檔案的內容 2 可以自動防止檔案的內容被重複拷貝 2.import nsobjcruntime.h中有nslog函式的宣告,一般用 3.foundation框架標頭檔案的路徑 4.主標頭...

黑馬程式設計師 OC基礎 記憶體管理

oc的區域性變數在 塊結束時被系統銷毀,記憶體被 oc的物件,內部有引用計數器,當引用計數器的值為0時,被系統銷毀,記憶體被 區域性變數存放在棧中.物件存放在堆中.注意,物件指標還是存放在棧中,物件本身占用的記憶體存放在堆中.在oc中,我們要對自己寫的繼承了nsobject的物件進行記憶體管理.物件...

黑馬程式設計師 OC封裝

物件導向的三大特性 封裝 繼承和多型 在開發過程中,考慮到安全性要求,我們一般不在成員變數名前面使用 public protected等關鍵字修飾,而是使用set方法來為物件提供成員變數的值。set方法的內部也可以對一些不合理的賦值進行篩選過濾。set方法的作用 為外界提供乙個設定成員變數值的方法 ...