關(guān)聯(lián)對象-給分類“添加成員變量”

思考:如何實現(xiàn)給分類“添加成員變量”?

默認(rèn)情況下,因為分類底層結(jié)構(gòu)的限制,不能添加成員變量到分類中。但可以通過關(guān)聯(lián)對象來間接實現(xiàn)

關(guān)聯(lián)對象提供了以下API
添加關(guān)聯(lián)對象
void objc_setAssociatedObject(id object, const void * key,
id value, objc_AssociationPolicy policy)

獲得關(guān)聯(lián)對象
id objc_getAssociatedObject(id object, const void * key)

移除所有的關(guān)聯(lián)對象
void objc_removeAssociatedObjects(id object)

static void *MyKey = &MyKey;
objc_setAssociatedObject(obj, MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, MyKey)

static char MyKey;
objc_setAssociatedObject(obj, &MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, &MyKey)

使用屬性名作為key
objc_setAssociatedObject(obj, @"property", value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_getAssociatedObject(obj, @"property");

使用get方法的@selecor作為key
objc_setAssociatedObject(obj, @selector(getter), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, @selector(getter))


image.png

底層原理

實現(xiàn)關(guān)聯(lián)對象技術(shù)的核心對象有
AssociationsManager
AssociationsHashMap
ObjectAssociationMap
ObjcAssociation

objc4源碼解讀:objc-references.mm


image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容