關(guān)聯(lián)對(duì)象的作用:
關(guān)聯(lián)對(duì)象可以給某個(gè)對(duì)象關(guān)聯(lián)一個(gè)或者多個(gè)其他對(duì)象黍檩,這些對(duì)象通過(guò)健來(lái)區(qū)分。
創(chuàng)建存儲(chǔ)關(guān)聯(lián)對(duì)象objc_setAssociatedObject:通過(guò)objc_setAssociatedObject把一個(gè)對(duì)象與另外一個(gè)對(duì)象進(jìn)行關(guān)聯(lián)始锚。相當(dāng)于 setValue:forKey 進(jìn)行關(guān)聯(lián)value對(duì)象刽酱。
void objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)
* ? ?第一個(gè)參數(shù):object? ??被關(guān)聯(lián)的對(duì)象(源對(duì)象)
*? ? 第二個(gè)參數(shù):key? ??要關(guān)聯(lián)的對(duì)象的key,一般設(shè)置成全局靜態(tài)變量瞧捌。要保證全局唯一棵里,key與關(guān)聯(lián)的對(duì)象是一一對(duì)應(yīng)關(guān)系。
*? ? 第三個(gè)參數(shù):value?? ??關(guān)聯(lián)的對(duì)象
*? ? 第四個(gè)參數(shù):policy? ? 關(guān)聯(lián)時(shí)采用的協(xié)議姐呐,即存儲(chǔ)策略(枚舉類(lèi)型)
關(guān)聯(lián)協(xié)議objc_AssociationPolicy:關(guān)聯(lián)策略表明了相關(guān)的對(duì)象是通過(guò)賦值殿怜,保留引用還是復(fù)制的方式進(jìn)行關(guān)聯(lián)的
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy){
????OBJC_ASSOCIATION_ASSIGN =0,
????OBJC_ASSOCIATION_RETAIN_NONATOMIC =1,
????OBJC_ASSOCIATION_COPY_NONATOMIC =3,
????OBJC_ASSOCIATION_RETAIN =01401,
????OBJC_ASSOCIATION_COPY =01403/**< Specifies that the associated object is copied.
};
*????OBJC_ASSOCIATION_ASSIGN 相當(dāng)于@property的assign
*????OBJC_ASSOCIATION_RETAIN_NONATOMIC 相當(dāng)于@property的nonatomic + retain
*????OBJC_ASSOCIATION_COPY_NONATOMIC 相當(dāng)于@property的nonatomic + copy
*????OBJC_ASSOCIATION_RETAIN 相當(dāng)于@property的retain
*????OBJC_ASSOCIATION_COPY 相當(dāng)于@property的copy
獲取關(guān)聯(lián)對(duì)象objc_getAssociatedObject:用來(lái)讀取關(guān)聯(lián)對(duì)象
id _Nullable objc_getAssociatedObject(id _Nonnull object,const void * _Nonnull key)
* ? ?第一個(gè)參數(shù):object? ? 要讀取的關(guān)聯(lián)對(duì)象的源對(duì)象。
*? ? 第二個(gè)參數(shù):key? ? 要讀取關(guān)聯(lián)對(duì)象對(duì)應(yīng)的key值曙砂。
移除關(guān)聯(lián)對(duì)象objc_removeAssociatedObjects:移除某個(gè)對(duì)象身上的所有關(guān)聯(lián)的對(duì)象头谜。(通常情況下不建議使用這個(gè)函數(shù),只有在需要把對(duì)象恢復(fù)到“原始狀態(tài)”的時(shí)候才會(huì)使用這個(gè)函數(shù)鸠澈。)
void objc_removeAssociatedObjects(id _Nonnull object)
* ? ?第一個(gè)參數(shù):object? ? 要移除關(guān)聯(lián)對(duì)象的源對(duì)象柱告。
ps:objc_removeAssociatedObjects方法是移除object上的所有關(guān)聯(lián)對(duì)象截驮。所以如果我們只是需要移除object上面的一條關(guān)聯(lián)對(duì)象,可以通過(guò)objc_setAssociatedObject函數(shù)傳入nil的方式來(lái)達(dá)到移除某個(gè)關(guān)聯(lián)對(duì)象的目的际度。