分類與擴充套件

2021-08-22 02:45:48 字數 1727 閱讀 6474

類擴充套件(extension)是category的乙個特例,有時候也被稱為匿名分類。他的作用是為乙個類新增一些私有的成員變數和方法。

其實我們經常使用到類擴充套件, 當我們建立乙個新的控制器的時候 會出現下面的**段 :

@inte***ce

stwebviewcontroller ()//這就是類擴充套件的寫法

@property (nonatomic, strong) uiwebview *webview;

- (void)seturl;

@end

類擴充套件可以定義在.m檔案中,這種擴充套件方式中定義的變數都是私有的,也可以定義在.h檔案中,這樣定義的**就是共有的,類擴充套件在.m檔案中宣告私有方法是非常好的方式。不過類擴充套件中新增的新方法,一定要實現。categorygory中沒有這種限制。

a) 從上面內容了解到,分類只能新增方法。那麼能不能新增成員變數呢,或者增加屬性呢?

object-c中,category是不支援直接新增屬性的,不過這不是很嚴謹,如果需要新增新的屬性還是可以新增的,使用runtime中的關聯物件技術就可以實現。

還是先來了解一下,為什麼分類不能新增成員變數吧 :

常規來說,在類中使用@property進行屬性宣告,編譯器會自動生成getter和setter方法。但是在category的指標結構體當中是沒有屬性列表的(ps : 指標結構體可以了解一下runtime機制,所以當你在category中使用@property建立屬性的時候編譯器是不會幫你生成getter和setter方法,編譯的時候不會出現問題,但是run了之後就會崩潰。

不過,由於oc是動態語言,方法真正的實現是通過runtime完成的,雖然系統不給我們生成setter/getter,但我們可以通過runtime手動新增setter/getter方法。

具體新增步驟如下 :

分類.h

#import "programmer.h"

@inte***ce

programmer (category)

@property(nonatomic,copy) nsstring *namewithsettergetter; //設定setter/getter方法的屬性

- (void) programcategorymethod; //分類方法

@end

分類.m

#import "programmer+category.h"

#import

static

nsstring *namewithsettergetterkey = @"namewithsettergetterkey"; @implementation

programmer (category)

- (void)setnamewithsettergetter:(nsstring *)namewithsettergetter

- (nsstring *)namewithsettergetter

- (void)programcategorymethod

@end

這樣就可以使用namewithsettergetter這個屬性了

類擴充套件與分類

類擴充套件與分類 建立日期 2016.5.12 類擴充套件可以新增方法與屬性 下面為uiview的類擴充套件 inte ce uiview uiviewhierarchy property nullable,nonatomic,readonly uiview superview property n...

協議 分類 擴充套件

1.什麼是協議 協議就是規則,定義乙個協議就相當於制定規則。oc中類可以遵守協議,遵守了乙個協議的類相當於擁有了一種能力。1.2.協議的定義 protocol 協議名 required 宣告必須遵守的屬性和方法 optional 宣告可選遵守的屬性和方法 預設 required end 2.1什麼是...

iOS 類擴充套件與分類的區別

類擴充套件 class extension也有人稱為匿名分類 能為某個類附加額外的屬性,成員變數,方法宣告 一般的類擴充套件寫到.m檔案中 一般的私有屬性寫到類擴充套件 inte ce mitchell 屬性 方法 end分類的小括號中必須有名字 inte ce 類名 分類名字 方法宣告 end i...