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

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

},

}

}

这种表现形式。

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



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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 有朋友跟我吐槽说最近太心烦了,孩子老是哭闹。 给他吃玉米棒,吃着吃着发现有两根长短不一样,哭了。 去幼儿园接他,临...
    同行xing阅读 2,812评论 0 1
  • 亲爱的Y: 好久不见,近来可好? 今天是8月29日,距离你生日还有11天,你自己肯定又会忘记吧。隔了许久没有在生日...
    简小取阅读 3,730评论 1 3
  • 文字:禅翁 一次饭局,偶遇某已故著名作家的公子。咋看上去给人印象——高大魁梧,体态圆浑,衣衫宽绰,深不可...
    禅翁阅读 1,807评论 0 0
  • 今天我站在教学楼三楼,眺望湖堤,茫然中,我又看到了一棵枯死的水杉。时候已是仲春,可那个逢春的水杉是不可能再显一丝绿...
    邓阿林阅读 2,523评论 0 2