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和策略)

关联对象的原理
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容