思考:如何實現(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