對象關(guān)聯(lián)(或稱為關(guān)聯(lián)引用)本來是Objective-C 2.0運行時的一個特性;
<objc/runtime>中定義的以下三個允許你將任何鍵值在運行時關(guān)聯(lián)到對象上的函數(shù):
objc_setAssociatedObject
objc_getAssociatedObject
objc_removeAssociatedObjects
為什么我說這個很有用呢?因為這允許開發(fā)者對已經(jīng)存在的類在擴展中添加自定義的屬性,這幾乎彌補了Objective-C最大的缺點。
NSObject+AssociatedObject.h
@interface? NSObject? (AssociatedObject)
@property(nonatomic,strong)id associatedObject;
@end
NSObject+AssociatedObject.m
@implementationNSObject(AssociatedObject)
@dynamicassociatedObject;
- (void)setAssociatedObject:(id)object {
objc_setAssociatedObject(self,@selector(associatedObject),object,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id)associatedObject {
? ? return? ? objc_getAssociatedObject(self,@selector(associatedObject));
}
通常推薦的做法是添加的屬性最好是static char類型的焦人,當(dāng)然更推薦是指針型的孕讳。通常來說該屬性應(yīng)該是常量妻怎、唯一的蚯嫌、在適用范圍內(nèi)用getter和setter訪問到:
static? char? kAssociatedObjectKey;
objc_getAssociatedObject(self,&kAssociatedObjectKey);
然而可以用更簡單的方式實現(xiàn):用selector拢操。
刪除屬性
你可以會在剛開始接觸對象關(guān)聯(lián)時想要嘗試去調(diào)用objc_removeAssociatedObjects()來進行刪除操作渠概,但如文檔中所述茶凳,你不應(yīng)該自己手動調(diào)用這個函數(shù):
此函數(shù)的主要目的是在“初試狀態(tài)”時方便地返回一個對象。你不應(yīng)該用這個函數(shù)來刪除對象的屬性高氮,因為可能會導(dǎo)致其他客戶對其添加的屬性也被移除了慧妄。規(guī)范的方法是:調(diào)用objc_setAssociatedObject方法并傳入一個nil值來清除一個關(guān)聯(lián)。