之前章节
07.load与initialize详解
这一节讲下关联对象的本质,众所周知,分类可以添加一个属性,那么是不是代表它添加了一个成员变量呢?答案是否定的,只能说间接性的添加了一个成员变量,如下图代码,在Person+test添加了一个name的属性
分类添加属性
如果想要添加成功,还需实现关联代码,如下:
Person的name关联代码
那么关联代码究竟做了些什么呢?我们直接从源码角度分析给你看
objc_setAssociatedObject源码
找到_object_set_associative_reference源码
_object_set_associative_reference源码1
_object_set_associative_reference源码2
从上图可以看出,通过
ObjcAssociation association{policy, value};
这句代码把修饰符和值包装成ObjcAssociation,然后呢,通过key查找associations中有无对应的association,如果有就替换,没有就设置,然后associations又是从AssociationsManager获取,分析出来结构图大概如下:
关联对象数据结构图
对应到Person就是下图这样子
person的具体例子
- 首先会将policy(copy)和value(张三)包装成ObjectAssociation
- 然后将key和ObjectAssociation保证成AssociationsMap
- 然后将对象(person1)和AssociationsMap包装成AssociationsHashMap
- 最后AssociationsHashMap放到AssociationsManager中
总结
分类不能直接添加成员变量,但可以使用关联对象技术间接实现添加成员变量,用法一致!