美文网首页
在既有类中使用关联对象存放自定义数据

在既有类中使用关联对象存放自定义数据

作者: bamboomoon | 来源:发表于2016-09-18 14:02 被阅读0次

为什么需要关联对象

有时需要在对象中存放相关信息。通常的做法:从这个对象的类中继承一个子类,来存放我们的信息。但是,有时候对象不是直接通过类来创建的,这种时候我们就没法来通过继承一个子类保存我们需要的信息。

所以,为了解决这个问题。就有了 『关联对象』


关联对象的策略

关联类型 等效的@property 属性
OBJC_ASSOCIATION_ASSIGN assign
OBJC_ASSOCIATION_RETAIN_NONATIONMIC nonationmic,retain
OBJC_ASSOCIATION_COPY_NONATIONMIC nonationmic,copy
OBJC_ASSOCIATION_RETAIN retain
OBJC_ASSOCIATION_COPY copy

管理关联对象的方法

  • void objc_setAssociatedObject(id object,void *key,id value ,objc_AssociationPolicy policy) 给定键和策略给某个对象设置关联对象
  • id objc_getAssociatedOjbect(id object,void *key)根据键从某个对象中取出对应的关联对象
  • void objc_removeAssociatedObjects(id object)移除某个对象的所有关联对象

理解关联对象

我们可以把某对象想象成 NSDictonary .关联到该对象的值理解为字典中的条目

存取对象的值就相当于字典对象上调用[object setObject:value forKey:key][object objectForKey:key]

两者之间有个重要的差别: 设置关联对象是用的键(key) 是个不透明的指针(其所指向的数据结构不局限于某种特定类型的指针)

在设置关联对象时,若想令两个键匹配到同一个值,则两者必须是相同的指针才行。所以在设置关联对象值是,通常使用静态全局变量做键(static void *EOCMyAlertViewKey = "EOCMyAlertViewKey";)

注意

  • 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难以查找的 BUG

相关文章

网友评论

      本文标题:在既有类中使用关联对象存放自定义数据

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