关联对象
在分类中可以定义property
,但是编译器并不会@synthesize
实例变量。一般有需求添加实例变量属性时会采用objc_setAssociatedObject
和objc_getAssociatedObject
方法绑定方法绑定,不过这种方法生成的与一个普通的实例变量完全是两码事。
objc_setAssociatedObject
分析源码后发现苹果为分类的属性建造了一个大的hashmap,这个大的hashmap的里面又根据对象划分了多个子hashmap,划分的依照object来划分。每个子hashmap中存放了各个分类添加的属性。
1 | void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) { |
发现内部调用了_object_set_associative_reference
1 | void _object_set_associative_reference(id object, void *key, id value, uintptr_t policy) { |
_object_get_associative_reference
取值比较简单,就是根据key和object对象进行遍历
1 | id _object_get_associative_reference(id object, void *key) { |