Runtime应用之关联对象和MethodSwizzling

473 查看

最近用到了sunnyxx的forkingdog系列《UIView-FDCollapsibleConstraints》,纪录下关联对象和MethodSwizzling在实际场景中的应用。

基本概念

关联对象

  • 关联对象操作函数
    • 设置关联对象:

    • 获取关联对象:

    其中设置关联对象的策略有以下5种:

    • 和MRC的内存操作retain、assign方法效果差不多
      • 比如设置的关联对象是一个UIView,并且这个UIView已经有父控件时,可以使用OBJC_ASSOCIATION_ASSIGN

关联对象在一些第三方框架的分类中常常见到,这里在分析前先看下分类的结构:

从以上的分类结构,可以看出,分类中是不能添加成员变量的,也就是Ivar类型。所以,如果想在分类中存储某些数据时,关联对象就是在这种情况下的常用选择。

需要注意的是,关联对象并不是成员变量,关联对象是由一个全局哈希表存储的键值对中的值。

全局哈希表的定义如下:

其中的AssociationsHashMap就是那个全局哈希表,而注释中也说明的很清楚了:哈希表中存储的键值对是(源对象指针 : 另一个哈希表)。而这个value,即ObjectAssociationMap对应的哈希表如下: