associatedObject又称关联对象。顾名思义,就是把一个对象关联到另外一个对象身上。使两者能够产生联系。
这样我们就可以通过associatedObject在运行时给cagetory添加getter和setter。因为category中添加的property不会生成带下划线"_"的成员变量以及getter和setter的实现。所以可以通过关联对象实现getter和setter。
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
参数一:id object : 给哪个对象添加属性,这里要给自己添加属性,用self。
参数二:void * == id key : key值,根据key获取关联对象的属性的值,在objc_getAssociatedObject中通过次key获得属性的值并返回。
参数三:id value : 关联的值,也就是set方法传入的值给属性去保存。
参数四:objc_AssociationPolicy policy: 策略,属性以什么形式保存。
objc_getAssociatedObject(id object, const void *key);
参数一:id object : 获取哪个对象里面的关联的属性。
参数二:void * == id key : 什么属性,与objc_setAssociatedObject中的key相对应,即通过key值取出value。
总结:
关联对象并不存储在被关联对象本身内存中,而是有一个全局统一的 AssociationsManager中
一个实例对象就对应一个ObjectAssociationMap,
而ObjectAssociationMap中存储着多个此实例对象的关联对象的key以及ObjcAssociation,
ObjcAssociation中存储着关联对象的value和policy策略
网友评论