美文网首页
使用关联对象技术添加属性的本质

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

作者: Horson19 | 来源:发表于2018-09-14 11:30 被阅读15次

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

},

}

}

这种表现形式。

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

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

相关文章

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

    上一篇文章提到了为分类增加属性使用的objc_setAssociate方法与objc_getAssociate方法...

  • 为什么使用Runtime又可以添加属性?

    使用Runtime技术中的关联对象可以为类别添加属性。其原因是:关联对象都由AssociationsManager...

  • 【知识总结】category探索 — 如何在分类中添加一个属性(

    添加属性的本质: 对象添加属性,并不是在对象中为属性分配响应的内存,而是通过一个指针指向这个属性,本质就是关联这个...

  • runtime的实际应用

    1、使用关联对象动态给分类添加属性 使用关联对象,可以为类添加Category中的属性,我们可以为现有类添加一些实...

  • OC语言之category_关联对象的本质源码解析

    关联对象 能否给分类添加"成员变量"? 使用关联对象技术为分类添加"成员变量" 关联对象添加的"成员变量"添加到了...

  • Swift5.1学习随笔之扩展extension添加属性

    默认情况下扩展不能包含存储属性,只能包含计算属性(本质是方法)。可以通过使用关联对象是实现扩展添加属性。(swif...

  • Runtime #2

    Category关联属性 为一个对象设置关联对象,实现为其添加属性的效果,使用方法 Method Swizzlin...

  • 关联对象

    在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散...

  • 关联对象

    在分类中不能添加属性,但是却可以使用 关联对象的方式,给类添加变量。主要重点是: 关联对象的实现方式。 关联对象散...

  • 07.Objective-C 关联对象

    问题 分类中可以添加属性吗? 整么才能使分类中的属性,像正常类的属性一样使用? 关联对象的本质 答案 分类中可以添...

网友评论

      本文标题:使用关联对象技术添加属性的本质

      本文链接:https://www.haomeiwen.com/subject/vyzpgftx.html