上一篇文章提到了为分类增加属性使用的objc_setAssociate方法与objc_getAssociate方法
关于使用这两个方法给分类添加属性的实质如下:
首先分析objc_setAssociate方法中的四个参数:1.objcet,2.key,3.value,4policy
首先明确一点,用关联对象创建的属性并不会存储在类的相关成员变量列表中,而是由AssociationsManager管理,并在AssociationsHashMap中存储,AssociationsHashMap是一个映射表,相当于一个字典,用object当作key,AssociationsMap当作value存储在同一个全局容器中。其中要注意,一个项目中所有的关联对象都是存储在同一个全局容器中的。
关于关联对象方法是如何将一个关联对象的属性存储在一个全局容器中的过程如下:
先将set方法中的value与policy封装为一个名叫ObjcetAssociation的对象,再以方法参数中的key为键,封装为一个名叫ObjcetAssociationMap的对象,其中以hash映射的方式将key与对应的ObjcetAssociation关联起来,并且ObjcetAssociationMap中存储的对象是该Object关联对象中存储的所有关联的属性(所以,在创建ObjcetAssociationMap对象的时候,如果已经存在了ObjcetAssociationMap对象,便会从中取出,如果是object第一次进行关联,便会创建一个新的ObjcetAssociationMap对象)
随后,将ObjcetAssociationMap中搭载的所有key-value形式的内容搭载完成后,便将object的指针作为key映射搭载好的ObjcetAssociationMap,形成一个AssociationHashMap对象,这个就是最终进行关联对象所创建出来的结果。
以json字符串的展现形式来看,类似于
{
"0x8912050028":{
"@selector(name)"{
"value":"Jack",
"policy":"copy"
},
"0x8912012428":{
"@selector(age)"{
"value":23,
"policy":"assign"
},
"0x8915210028":{
"@selector(father)"{
"value":0xff8909,
"policy":"retain"
},
}
}
这种表现形式。
所以,一个关联对象的原理与过程,大概就是这样了
本文由作者原创,未经允许不得转载