Objective C中的類別和非正式協議

2021-06-29 12:12:09 字數 3149 閱讀 8096

在編寫物件導向的程式時,你經常希望向現有的類新增一些新的行為:你總是能夠為物件提供使用這些新方法的新手段。當希望為現有的類增加新行為時,我們通常會建立子類,但是有時候子類並不方便。例如,你可能會希望為nsstring類增加一些新行為,但是你知道nsstring實際上只是乙個類簇的前台表示,因而無法為這樣的類建立子類。在其他情況下,你也許可以建立子類但你使用的卻是工具包或類庫,因為又無法處理新類的物件。例如,當使用類方法stringwithformatfor生成乙個新的字串時,你新建的nsstring類的子類無法返回。

利用objective-c的動態執行時分配機制,可以為現有的類新增新方法,這種為現有的類新增新方法的方式稱為類別catagory,他可以為任何類新增新的方法,包括那些沒有源**的類。類別使得無需建立物件類的子類就能完成同樣的工作。

一、建立類別

1、宣告類別

宣告類別與宣告類的形式很相似

@inte***ce  nsstring(numberconvenience)

-(nsnumber *)lengthasnumber;

@end//numberconvenience

這個宣告有兩個特點:

(1)現有的類位於@inte***ce關鍵字之後,其後是位於圓括號中的類別名稱。類別名稱是numberconvenience,而且該類別將向nsstring類中新增方法。換句話說:「我們向nsstring類中新增乙個名稱為numberconvenience的類別。」

同名類別有唯一性,但是可以新增任意多的不同名類別。

(2)可以執行希望向其新增類別的類以及類別的名稱,還可以列出新增的方法

不可以新增新的例項變數,類別生命中沒有例項變數部分。

2、實現類別

@implementation nsstring(numberconvenience)

-(nsnumber *)lengthasnumber

//lengthasnumber

@end//numberconvenience

在實現部分也包括類名、類別名和新方法的實現**

3、類別的侷限性

有兩方面侷限性:

(1)無法向類中新增新的例項變數,類別沒有位置容納例項變數。

(2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具有更高的優先順序。類別方法將完全取代初始方法從而無法再使用初始方法。

無法新增例項變數的侷限可以使用字典物件解決

4、類別的作用

類別主要有3個作用:

(1)將類的實現分散到多個不同檔案或多個不同框架中。

(2)建立對私有方法的前向引用。

(3)向物件新增非正式協議。

二、功能

一、利用類別分散實現

我們可以將類的介面放入標頭檔案中,從而將類的實現放入.m檔案中

但不可以將@implementation分散到多個不同的.m檔案中,使用類別可以完成這一工作

利用類別,可以將乙個類的方法組織到不同的邏輯分組中,使程式設計人員更加容易的閱讀標頭檔案

舉例**:

標頭檔案catagorything.h包含類的宣告和一些類別,匯入foundation框架,然後帶有3個整型變數的宣告

#import

@inte***ce categorything : nsobject

@end // categorything

類宣告之後是3個類別,每個類別具有乙個例項變數的訪問器,將這些實現分散到不同的檔案中

@inte***ce categorything(thing1)

- (void) setthing1: (int) thing1;

- (int) thing1;

@end // categorything (thing1)

@inte***ce categorything (thing2)

- (void) setthing2: (int) thing2;

- (int) thing2;

@end // categorything (thing2)

@inte***ce categorything (thing3)

- (void) setthing3: (int) thing3;

- (int) thing3;

@end // categorything (thing3)

類別可以訪問其繼承的類的例項變數,類別的方法具有最高的優先順序

類別可以分散到不同檔案中,甚至不同框架中

三、功能

二、使用類別建立前向引用

前面提到,cocoa沒有任何真正的私有方法。只要知道物件支援的某個方法的名稱,即使該物件所在類的藉口中沒有該方法的宣告,你也可以呼叫該方法。

不過,如果你這樣使用,編譯器會報警告。如果這時候,你使用可類別,就可以消除這些警告了。

例子,有這麼乙個類methodstest

介面宣告了兩個方法  showinfo1()和showinfo2()

在實現中,有3個方法

也就是說showinfo3()方法

在介面中沒有宣告,如果直接使用會報出警告

如果,加上類別,就不會有警告了。

四、功能三、

向物件新增非正式協議

建立乙個nsobject的類別稱為「建立乙個非正式協議」。因為,nsobject是頂級父類,在nsobject中新增了該方法,也就是說通過繼承關係,所有的類中都有該方法。

正式協議是通過protocol指定的一些列方法的宣告,然後由實現該協議的類自己去實現這些方法。而非正式協議是通過向nsobject中新增乙個類別來實現,然後子類去繼承nsobject。其實都差不多。

不過,非正式協議已經漸漸被正式協議取代,正式協議最大的優點就是可以使用泛型約束,而非正式協議則不可以。

objective c類別和類擴充套件學習筆記

類別是對已經存在的類的一種擴充套件方式。可以為其新增新的方法和屬性,但是不能新增新的例項變數。如果新增例項變數,就會破壞已存在的類原有的結構 命名方式 inte ce nsstring mynsstring void getstrlength 優點 可以把類的實現放在不同的檔案中,減小檔案的大小。缺...

Objective C之 類別小例項

內容大綱 已知乙個字串,要求找出字串中所有的阿拉伯數字並計算其個數 例如 a123sb23r2jsowsalwf 求數字的個數 1 計數器思想,定義乙個變數儲存結果 2 遍歷字串,取出字串中所有的字元1 import23 int getstrcount nsstring str 411 12retu...

Objective C之 類別小例項

內容大綱 已知乙個字串,要求找出字串中所有的阿拉伯數字並計算其個數 例如 a123sb23r2jsowsalwf 求數字的個數 1 計數器思想,定義乙個變數儲存結果 2 遍歷字串,取出字串中所有的字元 1 import23 int getstrcount nsstring str 4 11 12re...