iOS底层原理 - 关联对象本质

面试题引发的思考:

Q: 简单介绍一下关联对象原理?

  • 关联对象由 全局的结构AssociationManager 管理,并在AssociationsHashMap存储;
  • 所有对象的关联内容都在 同一个全局容器 中。
关联对象底层对象关系图
  • 一个实例对象 对应 一个AssociationsHashMap
  • AssociationsHashMap中存储着 多个此实例对象 的关联对象的KeyObjcAssociation
  • ObjcAssociation存储着关联对象的valuepolicy策略。

关联对象原理:

先介绍一下实现关联对象技术的核心对象:

  • AssociationsManager
  • AssociationsHashMap
  • ObjectAssociationMap
  • ObjectAssociation

源码中出现的Map相关的方法,与OC中的字典类似,包含keyvalue,存在类似对应关系。

AssociationsManager
AssociationsHashMap与ObjectAssociationMap

由以上源码可以得出四个核心对象的结构:

四个核心对象的结构

而这四个核心对象的关系如下:

关联对象底层对象关系图

以上可以总结为:

  • 一个实例对象对应一个AssociationsHashMap
  • AssociationsHashMap中存储着多个此实例对象的关联对象的KeyObjcAssociation
  • ObjcAssociation存储着关联对象的valuepolicy策略。

关联对象的值它不是存储在自己的实例对象的结构中,而是维护了一个全局的结构AssociationManager

关联对象方法

(1) objc_setAssociatedObject:函数解读:

objc_setAssociatedObject:函数

由源码可知:

objc_setAssociatedObject:函数按照核心的关系一层一层的将数据存储完成。


(2) objc_getAssociatedObject:函数解读:

objc_getAssociatedObject:函数

由源码可知:

objc_getAssociatedObject:函数如objc_setAssociatedObject:函数一样,按照反向顺序一层一层获取value


(3) objc_removeAssociatedObjects:函数解读:

objc_removeAssociatedObjects:函数

由源码可知:

_object_remove_assocations:函数会将object对象对应的所有关联对象全部删除。

总结可知:

  • 关联对象并不是存储在被关联对象本身内存中,而是存储在全局的统一的一个AssociationsManager中;
  • 如果设置关联对象为nil,就相当于是移除关联对象。·
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 首先,不要意外,不要怀疑,我没有写错。 其次,如果关注留意我的朋友,不知道你们还记不记得,2016年12月10日,...
    许_小美阅读 506评论 0 0
  • 2017年终总结~~东风吹,战鼓擂,历史的潮流不可挡。2017是碗子极不平凡的关键一年。按照“稳心、转型、提高”的...
    瘦人碗子阅读 283评论 3 3
  • 01,家庭 2017年在毫无悬念的等待中终于接近尾声,这一年,我最大的收获就是迎来了我的亭宝,还有亮宝的健康成长。...
    澜绣阅读 448评论 1 1
  • 一天吃着不咸不淡的三顿饭,每周跟学生们斗智斗勇,每个月来点大姨妈……好嘛!这可就年底了!真叫人懵圈圈儿! 眼看着就...
    山水平生阅读 859评论 5 18
  • 作家萨冈说:“所有漂泊的人生都梦想着平静、童年、杜鹃花,正如所有平静的人生都幻想伏特加、乐队和醉生梦死。”我想我们...
    Ormosia阅读 1,111评论 0 2