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

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

作者: 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