美文网首页
关联对象

关联对象

作者: 蔚尼 | 来源:发表于2018-07-12 14:44 被阅读6次

分类、类扩展、继承的总结讲述了分类,介绍到分类可以添加属性,但是属性的get、set方法需要通过runtime的关联对象进行添加。

  • 还有一个问题是,是否可以给分类添加“成员变量”?(面试问题
    可以,通过关联对象添加。

  • 怎么擦除一个关联对象?(```面试问题````)
    把这个key关联的值设置为nil。

    objc_setAssociatedObject(self,@selector(text), @"hello", OBJC_ASSOCIATION_COPY_NONATOMIC);
    NSLog(@"获取设置的值:%@",objc_getAssociatedObject(self, @selector(text)));// 获取设置的值:hello
    
    objc_setAssociatedObject(self,@selector(text), nil, OBJC_ASSOCIATION_COPY_NONATOMIC);
    NSLog(@"值被擦除后:%@",objc_getAssociatedObject(self, @selector(text)));//值被擦除后:(null)
  • 这个“成员变量”添加到哪里了呢?(面试问题
    添加到一个全局容器当中。

关联对象由AssociationsManafer管理在AssociationsHashMap中;
所有对象的关联内容都在同一个全局容器

详细了解这个全局容器,我们需要查看关联对象的本质。

关联对象的本质

如下,我们关联对象都是通过这个方法。
/*
obj:为哪个对象关联
key:关联的key
value:关联的值
policy:什么方式存储,copy、retain、assign
*/

 objc_setAssociatedObject(id obj, const void * _Nonnull key, id  _Nullable value, objc_AssociationPolicy policy)

我们为当前对象进行关联,key为@selector(text),值为"hello",类型为copy类型

    objc_setAssociatedObject(self,@selector(text), @"hello", OBJC_ASSOCIATION_COPY_NONATOMIC);

关联本质:

如下图

  1. 有一个结构体ObjcAssociation,存储着value值"hello"、存储策略OBJC_ASSOCIATION_COPY_NONATOMIC;
  2. 然后把ObjcAssociation作为value、和key存储到ObjctAssociationMap中。
  3. 最后把这个ObjctAssociationMap放到大容器AssociationMap中。
关联对象的本质

如下,一个大容器AssociationMap中有很多对象为key存储ObjctAssociationMap。每一个ObjctAssociationMap中有很多个ObjcAssociation。

关联对象的本质

相关文章

  • Swift 为分类增加属性objc_getAssociated

    OC 获取关联对象 Swift 获取关联对象——错误的写法 Swift 获取关联对象——正确的写法 设置关联对象 ...

  • iOS runtime关联对象 objc_setAssociat

    关联对象的作用: 关联对象可以给某个对象关联一个或者多个其他对象,这些对象通过健来区分。 创建存储关联对象objc...

  • 关联对象

    关联对象的方式 关联对象源码基本思路 关联对象的结构:AssociationsHashManager // Ass...

  • 关联对象

    关联对象原理 关联对象并不是存储在被关联对象本身内存中,关联对象存储在全局的统一的一个AssociationsMa...

  • iOS 关联对象

    概述 关联对象顾名思义,就是给对象关联对象的意思,一个对象可以关联多个其他对象,这些对象通过key来区分,存储对象...

  • 关联对象

    关联对象会用被关联对象作为key,将关联对象存储到全局的哈希表里。 AssociationHashMap Asso...

  • iOS关联对象技术原理

    iOS关联对象技术原理 iOS关联对象技术原理

  • 关联对象

    分类里面添加成员变量, 分类里面是不能直接添加成员变量的,但是可以通过runtime间接添加成员变量。 为什么...

  • 关联对象

    能否为分类添加 “成员变量” ? 为分类所添加的成员变量添加在哪里? 所有对象的关联内容都在同一个全局容器内关联对...

  • 关联对象

    分类、类扩展、继承的总结讲述了分类,介绍到分类可以添加属性,但是属性的get、set方法需要通过runtime的关...

网友评论

      本文标题:关联对象

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