iOS 分類新增屬性之關聯引用

2021-07-22 09:59:57 字數 2894 閱讀 6217

分類是不能合成屬性的,因為合成屬性會生成對應的例項變數,而分類是不允許新增例項變數的(例項變數所在記憶體區域已初始化為不可更改,無法在動態執行時修改之)。

雖然不能增加例項變數,但是新增屬性還是可以的,只不過需要自己在分類中實現get和set方法,同時標記屬性為動態獲取。

其中一種方法叫做關聯引用,實現了用訪問器來訪問屬性,當然實際上並沒有例項變數,所以本質上只不過是增加了兩個方法而已。

首先在.h中宣告屬性:

[objc]view plain

copy

#import 

@inte***ce

uiviewcontroller (propertytest)  

@property

(nonatomic

, copy

) nsstring

*testproperty;  

@end

然後在.m中實現:

[objc]view plain

copy

#import "uiviewcontroller+propertytest.h"

#import 

const

char

ktestproperty;

//宣告乙個唯一位址的key。或用static char ktestproperty;

@implementation

uiviewcontroller (propertytest)  

@dynamic

testproperty;

//執行時動態獲取

- (void

)settestproperty:(

nsstring

*)testproperty  

- (nsstring

*)testproperty  

@end

然後用**測試一下:

[objc]view plain

copy

self

.testproperty

= @"testproperty"

;  self

.testproperty

= [self

.testproperty

:@"add string"

];  

nslog(@"%@"

, self

.testproperty

);  

列印如下:

[objc]view plain

copy

2015

-05-

1715:

12:3

6.816

test_5_

17[3

508:

1209

580] testpropertyadd string  

可見實現了屬性的get和set功能。

給nsstring類新增兩種型別的屬性, 字串型別的tag值strflag, 以及int型的tag值inttag. 

定義這個兩個屬性的set和get方法:

[objc]view plain

copy

"font-size:18px;"

>

@inte***ce

nsstring (ass)  

// 物件屬性的set和get

- (void

)setstrflag:(

nsstring

*)strflag;  

- (nsstring

*)strflag;  

// 非物件屬性的set和get

- (void

)setintflag:(

int)intflag;  

- (int

)intflag;  

@end

實現這四個方法:

需匯入runtime標頭檔案:

[objc]view plain

copy

#import 

[objc]view plain

copy

@implementation

nsstring (ass)  

static

int_intflag;  

static

nsstring

*_strflag;  

- (void

)setstrflag:(

nsstring

*)flag   

- (nsstring

*)strflag   

- (void

)setintflag:(

int)intflag   

- (int

)intflag   

@end

使用規則和類別差不多, 乙個是拓展了方法, 乙個是拓展了屬性而已:

[objc]view plain

copy

nsstring

*str = 

@"macro "

; // 定義乙個系統的nsstring物件

str.strflag

= @"abc"

; // 給字串tag賦值

str.intflag= 4

56; // 給int型tag賦值

nslog(@"%@:%@-%d"

, str, str

.strflag

, str

.intflag

); // 使用拓展的屬性

工程原始碼

iOS分類新增屬性

我們可以通過runtime來給ios的分類新增屬性.1.首先我們像普通的類一樣在.h裡頭使用 property宣告乙個屬性 ch.h.這裡是 類的ch分類的.h檔案 inte ce ch property nonatomic strong nsstring name end這時,m中就會出現兩個警告...

ios 分類新增屬性。

我們都知道可以通過分類新增方法,但是是否可以新增變數有一部分人就不知道了 其實分類裡面是不可以新增成員變數的,但是卻可以新增屬性。這是因為在分類中新增的屬性不會自動生成set get方法,這是就需要自己在分類的實現檔案裡面實現屬性的set get方法,如果你跟平時一樣去寫set get方法你會發現 ...

iOS 為分類新增屬性

我們知道分類可以很簡單的新增方法,但是新增屬性卻無能為力,但是我們還是可以通過動run time的associate就可以做到 比如說我要在uimage中新增乙個url屬性 h inte ce uiimage url property nonatomic,copy nsstring url end ...