使用关联对象技术添加属性的本质

上一篇文章提到了为分类增加属性使用的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"

},

}

}

这种表现形式。

所以,一个关联对象的原理与过程,大概就是这样了

 

 

本文由作者原创,未经允许不得转载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值