Objective-C中的類目,延展,協議

青玉伏案發表於2015-12-15

Objective-C中的類目(Category),延展(Extension),協議(Protocol)這些名詞看起來挺牛的,瞬間感覺OC好高大上。在其他OOP語言中就沒見過這些名詞,剛看到這三個名詞的時候,有種感覺這是不是學習的坎?這東西難不難?能不能學會?經過本人親自驗證,這三個東西理解起來還是蠻簡單的,學過C++或者Java的小夥伴對比理解還是蠻輕鬆的。類目(Category)就是給已有的類擴充相應的方法,擴充的方法是公有的,類目還可以起到分模組的功能,下面會詳細說到。 延展(Extension)這個名詞就是是匿名類目的別稱,匿名類目就叫做延展,延展可以實現類方法的私有化,具體如何實現,下面有原始碼。協議我個人感覺和Java中的介面極為相似,在定義物件時使用協議,個人感覺和Java中得泛型有著異曲同工之妙,看下文的詳細介紹吧。(本文為筆者個人總結,歡迎批評指正)。

一.Objective-C中的類目(Category)

在Objective-C比其他OOP的程式語言多了個類目,在OC中除了用繼承來擴充類的功能函式外我們還可以用類目來實現。學過C++的小夥伴們是否還記得友元這個概念呢?友元就是非本類的方法可以使用本類中得變數,這也是對類方法的一個擴充,個人感覺在OC中得類目和C++中的友元有著異曲同工之妙(僅代表個人觀點,歡迎批評指正),下面我們就來詳細的學習一下OC中得類目吧。

提到類目呢,首先我們會問我們具體能拿類目做些什麼事情呢下面做一下總結:

1.可以用類目給已有的類擴充方法

2.可以用類目把類的實現按功能模組分為不同的檔案

3.可以用來擴充套件NSObject類的方法,也叫做非正式協議

編譯環境說明:  iMac OS X 10.9 (13A603) 編譯器:XCode 5.0.2版本

1.給已有的類擴充方法

在Xcode中新建CategoryTest類,在新建類中宣告兩個例項變數,在實現類中重寫description方法,列印輸出兩個例項變數的值

程式碼如下

新建一個CategoryTest的類目,來進行對類方法的擴充,

程式碼如下:

實現檔案:

測試執行結果:

2.對把類中不同的功能模組分成不同的檔案

1.給上面的類建立兩個類目,類目中分別存放例項變數的getter和setter方法,為了節省篇幅下面給出其中一個類目的事例;

介面的宣告:

類目的實現檔案:

對程式碼測試的結果:

3.非正式協議

非正式協議就是給NSObject類建立的類目又叫做非正式協議, 非正式協議一般不需要進行實現,一般在子類中進行方法的重寫。程式碼在這就不贅述啦!

類目的優缺點分析(下面有些是個人觀點,不對之處請批評指正)

優點:上面的功能也是類目存在的重要原因之所在,在這就不重複了

侷限性: 在類目中只可以為類新增方法,不能新增例項變數; 類目中得方法的優先順序要高。

二.Objective-C中的延展(Extension)

簡單的說匿名類目就是延展,在延展中定義的方法是類私有的方法只能在類的內部呼叫,定義延展的方式就是把類目中括號中得名字省略掉,括號保留這就是延展。其實在延展中定義的方法不是真正的私有方法和C++, Java中得方法還有所區別,在類初始化的檔案中引入相應延展的標頭檔案,其延展對應的方法也是可以訪問的。是通過隱藏延展的標頭檔案來達到方法私有 的。

定義私有方法有以下三種方式:

1.通過延展來實現方法的私有,延展的標頭檔案獨立。這種方法不能實現真正的方法私有,當在別的檔案中引入延展的標頭檔案,那麼在這個檔案中定義的類的物件就可以直接呼叫在延展中定義所謂私有的方法。demo如下:

程式碼如下:

延展相應的標頭檔案,延展方法的實現在類對應的.m中給出實現方法:

在main函式裡進行測試,如果在main函式裡引入#import “ExtensionTest_Extension1.h”也可以呼叫其裡面宣告的相應的方法

​    ​測試程式碼如下:

​    ​執行結果:

三、Objective中得協議Protocol

​    ​    ​協議(protocol)提到OC中得協議個人感覺和JAVA中的介面的用法極為相似。把類中常用的方法抽象成OC中得協議,協議中只有方法的宣告沒有方法的實現,在protocol中可以把方法定義成@required(必須的):在使用協議的類中如果不實現@required的方法,編譯器不會報錯但會給出警告。還可以把protocol中的方法定義成@optional(可選的)如果在使用協議的類中不實現@optional方法,則不會警告。協議的關鍵字用@protocol來定義。

​    ​    ​下面是協議的一個簡單demo;

​    ​    ​1.在Xcode中新建一個Protocol,命名為FirstProtocol,檔名為FirstProtocol.h . 在FirstProtocol協議中宣告瞭兩個方法,一個是@required一個是@optional的

​    ​    ​2.新建一個類命名為ProtocolClass, 在ProtocolClass.h中使用FirstProtocol協議,在ProtocolClass.m檔案中實現協議中得方法

​    ​    ​    ​ProtocolClass.h的程式碼如下:

​    ​    ​ProtocolClass.m的程式碼如下:

​    ​    測試的執行結果為:

​在宣告物件的時候引入協議可以類比這Java中得泛型來學習, 例如宣告一個遵守FirstProtocol協議的物件: id obj;下面我們將用一個事例來介紹具體的用法

​    ​    ​1.建立一個CalculatorProtocol的協議,在協議中宣告一個calculatorFunction的方法來進行兩個數的計算,檔名為:calculatorProtocol.h

​    ​    ​    ​程式碼如下: ​    ​

​      2.在CalculatorClass類中新增新的方法,在這個類中有一個計算方法,需要對兩個數的計算,有一個引數是物件型別的必須遵循協議CalculatorProtocol,主要程式碼如下:

​    ​   3.定義遵循協議calculatorProtocol的類AddClass,在AddClass中實現calculatorFunction方法,實現兩個數相加的功能程式碼如下

​      4.新建一個DecClass類,同樣遵循calculatorProtocol協議,實現兩個數相減的功能,主要程式碼如下:

​測試程式碼:

​執行結果如下:

再舉一個理解協議更好理解協議的例子吧,我們宣告一個檔案協議,協議的內容是對檔案的讀和寫。我們在宣告一個檔案管理系統的類,只要是檔案能讀和寫就能放進我們的檔案管理系統進行管理。

1.指定可放入檔案管理系統檔案需要遵循的協議,協議中規定檔案必須有讀寫的功能

程式碼如下

2.編寫檔案管理系統,來對所有遵守協議的檔案來進行的統一的管理

程式碼如下:

宣告:

實現:

3.定義新的檔案類來遵守我們的檔案讀寫協議,之後就可以放入到我們的管理系統中進行管理

檔案類1

在定義一個簡歷檔案,同樣遵守我們的檔案協議

然後我們可以把各種不同檔案但都遵循我們檔案協議的檔案放入到我們的檔案管理系統進行管理

執行結果:

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

Objective-C中的類目,延展,協議

相關文章