美文网首页
iOS底层 -- Category本质之关联对象

iOS底层 -- Category本质之关联对象

作者: happy神悦 | 来源:发表于2020-09-08 02:28 被阅读0次

通过分类的底层结构我们可以看到,分类中可以存放实例方法,类方法,协议,属性,但是没有存放成员变量的地方。
默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联对象来间接实现。

关联对象

一、关联对象提供了以下API:

- (void)objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
- (id)objc_getAssociatedObject(id object, const void * key)
- (void)objc_removeAssociatedObjects(id object)

二、key的常见用法:

1.使用静态的指针类型

static void *MyKey = &MyKey;
objc_setAssociatedObject(obj, MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, MyKey)

2.使用基本数据类型

static char MyKey;
objc_setAssociatedObject(obj, &MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, &MyKey)

3.使用属性名作为key

objc_setAssociatedObject(obj, @"property", value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_getAssociatedObject(obj, @"property");

4.使用get方法的@selecor

objc_setAssociatedObject(obj, @selector(getter), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, @selector(getter))

三、objc_AssociationPolicy对应的修饰符

objc_AssociationPolicy 对应的修饰符
OBJC_ASSOCIATION_ASSIGN assign
OBJC_ASSOCIATION_ASSIGN assign
OBJC_ASSOCIATION_RETAIN_NONATOMIC strong, nonatomic
OBJC_ASSOCIATION_COPY_NONATOMIC copy, nonatomic
OBJC_ASSOCIATION_RETAIN strong, atomic
OBJC_ASSOCIATION_COPY copy, atomic

关联对象的原理

一、实现关联对象技术的核心对象:

  • AssociationsManager
  • AssociationsHashMap
  • ObjectAssociationMap
  • ObjcAssociation

二、四个核心对象的结构:

三、四个核心对象之间对应关系:

相关文章

网友评论

      本文标题:iOS底层 -- Category本质之关联对象

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