不能直接给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和策略)
关联对象的原理