在既有类中使用关联对象存放自定义数据
2016-09-18 本文已影响0人
bamboomoon
为什么需要关联对象
有时需要在对象中存放相关信息。通常的做法:从这个对象的类中继承一个子类,来存放我们的信息。但是,有时候对象不是直接通过类来创建的,这种时候我们就没法来通过继承一个子类保存我们需要的信息。
所以,为了解决这个问题。就有了 『关联对象』
关联对象的策略
关联类型 | 等效的@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