Category能否添加成员变量,如果可以,如何添加?

不能直接给category添加成员变量,但是可以间接实现category有成员变量的效果

方法一:可以给分类添加字典(全局),但是有很多弊端(不推荐)会造成内存泄漏(字典不会释放),线程安全,每多一个属性,就需要多一个字典。

方法二:关联对象(并不是存储在关联对象本身的内存中)

添加关联对象

void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)

获得关联对象

id objc_getAssociatedObject(id object, const void * key)

移除所有的关联对象

void objc_removeAssociatedObjects(id object)

key常见的用法

static void *MyKey = &MyKey;

static char MyKey;  (用char类型的原因是只占一个字节,int占四个字节)

使用属性名作为key

使用get方法的@selecor作为key(推荐使用)

关联对象的底层数据结构:

结构体中有一个成员变量AssociationsHashMap,它的key是传入的object指针(实际上做了一些位运算),它的value是一个ObjectAssociationMap,ObjectAssociationMap的key是传入的指针地址,它的value是一个ObjcAssociation,ObjcAssociation结构中有两个成员变量,value和policy(传入的value和策略)

关联对象的原理

你可能感兴趣的:(Category能否添加成员变量,如果可以,如何添加?)