有時候我們需要在現有的類存放一些額外的資訊,通常的做法是繼承乙個子類,然後定義新增加的屬性,然而如果我們為每個需要的類都新增乙個類顯得太麻煩了,objc提供了乙個關聯屬性的特性,可以給乙個物件關聯乙個屬性(做過.net的朋友一定熟悉附加屬性,objc的關聯屬性與.net的附加屬性有點類似類似)
使用關聯屬性很簡單,下面是幾個主要的函式
//我們宣告屬性的時候會宣告:copy,retain,assign 記憶體管理方式,在設定關聯屬性的時候也有,即設定關聯屬性
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)
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的時候使用靜態全域性變數作為鍵,這樣可以保證位址一致
staticchar *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中,只有乙個目錄跟...