類別(category)延展(extension)

2021-09-24 06:31:24 字數 2074 閱讀 5758

objective-c中提供了可以讓我們擴充套件類定義的手段:類目,延展和協議。類目:為已知的類增加新的方法;延展:通知在本類的定義裡使用類目來宣告私有方法;協議:協議宣告了可以被任何類實現的方法。

1.類目(類別 category)

1)宣告類目

@inte***ce testmodel (newmodel)

-(void)newfun;

@end

該宣告具有2個特點。首先,現有類位於@inte***ce關鍵字之後,其後是位於圓括號中的乙個新名稱。該宣告表示,類別的名稱是newmodel,而且該類別將向testmodel類中新增方法。只要保證類別名稱的唯一性,你可以向乙個類中新增任意多得類別。你可以指定希望向其新增類別的類以及類別的名稱,而且你還可以列出新增的方法,最後以@end結束。由於不能新增新實現變數,因此與類宣告不同的是,類別的宣告中沒有例項變數部分和屬性,但是分類可以訪問原來類中的成員變數。

類目的侷限性

一,無法向類中新增新的例項變數,屬性,類別沒有位置容納例項變數。

二,名稱衝突,即類別中得方法與現有的方法重名。當發生名稱衝突時,類別具有更高的優先順序。你得類別方法將完全取代初始方法,從而無法再使用初始方法。因此在自己的類別方法中增加乙個字首,以確保不發生名稱衝突。

(可以有一些方法像類別中新增屬性,如下圖)

.h中新增屬性

.m中set和get 方法實現

類目的作用

類別主要用於三個目的:第一,將類的實現分散到不同檔案或者不同框架中。第二,建立對私有方法的前向引用。第三,向物件新增非正式協議

延展(extension)

類的延展可以看作是一種匿名的類目,類有時需要一些只為自己所見,所用的私有方法這種私有方法可以通過延展的方式來宣告,延展中定義的方法在類本身的@implementation**區域中進行實現。

@inte***ce myob : nsobject

nsnumber *num;

- (nsnumber *)num;

@end

@inte***ce myob(set)

- (void)setnum:(nsnumber *)newnum;

@end

@implementation myob

- (nsnumber *)num

return num;

- (void)setnum:(nsnumber *)newnum

//do some thing

@end

.m中用延展新增私有屬性

當在定義延展的時候不提供類目名時,延展中定義的方法既被視為「必須實現」的api在這種情況下,如果方法缺少實現**,則編譯器會報警告,此時方法的實現必須出現在類主體的@implementation**塊中,延展沒有自己的.m檔案,必須在原類.m中實現方法。

xcode中新增 類別和延展

新建

選擇檔案型別

協議和**模式

協議只宣告了方法,不具體實現,接受協議的物件負責實現。oc的協議是由@protocol宣告的一組方法列表,要求其它的類去實現,相當於@inte***ce部分的宣告。

注意:a.確認協議時應實現協議中 @required 修飾的方法

b.可以選擇性實現 @optional 修飾的方法

c.使用[物件 conformstoprotocol:@protocol(protocol)]判斷是否遵循協議

d.協議寫在提供協議類的.**件裡

協議的應用--**

**模式即本身不做時間的事情,而是要求其他人去做。

category和extension用來做類擴充套件的,可以對現有類擴充套件功能或者修改其功能。

在ios中category應用是非常廣泛的,系統自帶的很多類都有多個category擴充套件功能。

一般category中可以定義新的方法、重寫類原來的方法和新增readonly屬性

而extension可以認為是匿名的category,但是這個extension相對於category有有乙個特殊功能:

在extension中可以定義可寫的屬性,公有可讀、私有可寫的屬性(publicly-readable, privately-writeable properties)一般這樣實現!

區別

類別 category 以及類擴充套件

1.可以把類別看做是可擴充套件類的介面,而無需對類進行子類化。形式如下 inte ce nsstring extension void method end implementation nsstring extension void method end 2.類別不可以有新的例項變數,只包含方法。...

Object C 類別與擴充套件Category

object c 的動態特徵允許使用類別為現有的類新增新方法,並且不需要建立子類,不需要訪問原有類的源 通過使用類別,可以動態的為現有的類新增新方法,而且可以將類定義模組化的分布到多個相關檔案中。point 1 定義類名必須是該專案中沒有的類,而定義類別時使用的類名必須是已有的類 2 定義類別時必須...

category類別中新增屬性

1.不能新增的原因 首先,使用 property的時候,系統會自動生成帶 的成員變數和該變數的setter和getter方法。也就是說,屬性相當於乙個成員變數加getter和setter方法。但是,在類別新增屬性,此時person類裡並沒有新增帶 的成員變數,也沒有實現setter和getter方法...