0%

Runtime:关联对象

Associative运行时特性可以给两个对象建立关联关系,这是一种从属关系。

相关API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// objc/runtime.h
/** 给一个对象设置关联对象
object: 需要添加关联的源对象
key: 关联值的唯一key
value: 关联的具体值
policy: 关联的策略 (类似声明properties的参数)
*/
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

/** 获取某个对象的某个关联对象
object: 需要获取关联的源对象
key: 关联值的唯一key
*/
id objc_getAssociatedObject(id object, const void *key)

/** 移除对象的关联对象
object: 需要移除的源对象
*/
void objc_removeAssociatedObjects(id object)

应用场景:

  • 给系统类、第三方类添加属性。
  • 使用RETAIN_NONATOMIC关联类型的对象关联目标对象,以监听目标对象的生命周期。

实现原理

组成部分:

  • AssociationsManager:管理一个AssociationsHashMap。
  • AssociationsHashMap:用objc_setAssociatedObject传入的object为基础,进行一些其他操作后作为Key,ObjectAssociationMap为Value。
  • ObjectAssociationMap:用objc_setAssociatedObject传入的key作为Key,ObjcAssociation为Value。

对象关联的对象在-dealloc调用的object_dispose函数中释放。

参考

欢迎关注我的其它发布渠道