iOS 關聯屬性訪問資料

2021-09-07 02:24:22 字數 2799 閱讀 8528

有時候我們需要在現有的類存放一些額外的資訊,通常的做法是繼承乙個子類,然後定義新增加的屬性,然而如果我們為每個需要的類都新增乙個類顯得太麻煩了,objc提供了乙個關聯屬性的特性,可以給乙個物件關聯乙個屬性(做過.net的朋友一定熟悉附加屬性,objc的關聯屬性與.net的附加屬性有點類似類似)

使用關聯屬性很簡單,下面是幾個主要的函式

//

設定關聯屬性

objc_setassociatedobject(id

object, const

void *key, id

value, objc_associationpolicy policy)

//獲取關聯屬性

id result = objc_getassociatedobject(id

object, const

void *key)

//刪除所有附加屬性

objc_removeassociatedobjects(id

object)

我們宣告屬性的時候會宣告:copy,retain,assign 記憶體管理方式,在設定關聯屬性的時候也有,即 

objc_setassociatedobject

的第四個引數

關聯型別

等效@property屬性

objc_association_assign

assign

objc_association_retain_nonatomic

nonatomic

, retain

objc_association_copy_nonatomic

nonatomic, copy

objc_association_retain

retain

objc_association_copy

copy

關聯屬性的附加相當於nsdictionary,通過鍵值對儲存,但是有一點跟nsdictionary不一樣的是,設定關聯物件所用的鍵(key)是不透明指標(opaque pointer),nsdictionary判斷兩個key的isequal方法判斷是否相等,而關聯物件只判斷兩個key的位址是否相等,而不會比較物件具體的值

看看下面例子

nsstring *key1 = @"

aaa"

; nsstring *key2 = [nsstring stringwithformat:@"

aaa"

]; nsstring *key3 = @"

bbb"

;

nsobject *obj =[[nsobject alloc] init];

objc_setassociatedobject(obj, key1.utf8string,

@"aaa1

", objc_association_retain_nonatomic);

objc_setassociatedobject(obj, key2.utf8string,

@"aaa2

", objc_association_retain_nonatomic);

objc_setassociatedobject(obj, key3.utf8string,

@"bbb

", objc_association_retain_nonatomic);

id value1 =objc_getassociatedobject(obj, key1.utf8string);

id value2 =objc_getassociatedobject(obj, key2.utf8string);

id value3 =objc_getassociatedobject(obj, key3.utf8string);

nslog(

@"value1 = %@

", value1);

nslog(

@"value2 = %@

", value2);

nslog(

@"value3 = %@

", value3);

輸出

這裡的key1和key2都是@"aaa",但是取出來的value1和value2卻不一樣,這是因為key1和key2的位址不一樣,在匹配的時候關聯物件視為不同的key,所以通常我們在定義關聯物件的key的時候使用靜態全域性變數作為鍵,這樣可以保證位址一致

static

char *key = "

aaa"

; nsobject *obj =[[nsobject alloc] init];

objc_setassociatedobject(obj, key,

@"aaa1

", objc_association_retain_nonatomic);

objc_setassociatedobject(obj, key,

@"aaa2

", objc_association_retain_nonatomic);

id value1 =objc_getassociatedobject(obj, key);

//把原有的值覆蓋

id value2 =objc_getassociatedobject(obj, key);

nslog(

@"value1 = %@

", value1);

nslog(

@"value2 = %@

", value2);

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

分類是不能合成屬性的,因為合成屬性會生成對應的例項變數,而分類是不允許新增例項變數的 例項變數所在記憶體區域已初始化為不可更改,無法在動態執行時修改之 雖然不能增加例項變數,但是新增屬性還是可以的,只不過需要自己在分類中實現get和set方法,同時標記屬性為動態獲取。其中一種方法叫做關聯引用,實現了...

資料屬性和訪問器屬性

es5中定義了兩種屬性,分別是資料屬性和訪問器屬性。1 資料屬性 資料屬性的四個特性分別是它的值 value 可寫性 writable 可列舉性 enumerable 和可配置性 configurable var o 為物件o新增乙個值為1,屬性名為x,可寫,不可列舉,可配置的屬性。object.d...

IOS本地資料訪問

nsuserdomainmask 代表從使用者資料夾下找 yes 代表展開路徑中的波浪字元 nsarray array nssearchpathfordirectoriesindomains nsdocumentdirectory,nsuserdomainmask,yes 在ios中,只有乙個目錄跟...