用途:
Objective-C是一个具有动态特性的语言,我们可以为一个已有的类增添一个Category,在其中为已有类增加一些新东西。但需要注意的是,如果这个Category不和此类的原始定义再一起,那么这个类只能增加方法,而不能增加成员变量。这就意味着,即使我们在这个Category中写了@property,系统也不会为我们生成变量存储。但如果我们真得非要这么做,有没有办法呢?有,那就是AssociatedObject。
Associated Objects(关联对象)或者叫作关联引用(Associative References),是作为Objective-C 2.0 运行时功能被引入到 Mac OS X 10.6 Snow Leopard(及iOS4)系统。与它相关在<objc/runtime.h>中有3个C函数,它们可以让对象在运行时关联任何值:
objc_setAssociatedObject
objc_getAssociatedObject
objc_removeAssociatedObjects
通常推荐key使用static char类型——使用指针或许更好,key值是一个唯一的常量,并只在getters和setters方法内部使用:
用法:
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 14px; line-height: normal; font-family: Menlo; color: rgb(228, 68, 72);"><span style="font-variant-ligatures: no-common-ligatures; color: #d28f5a">#import </span><objc/runtime.h></p>
static char overlayKey;
- (UIView *)overlay
{
return objc_getAssociatedObject(self, &overlayKey);
}
- (void)setOverlay:(UIView *)overlay
{
objc_setAssociatedObject(self, &overlayKey, overlay, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
假设现在已有class A,现在要对A类做扩展,我可以写一个A的Category,增加一个property,比如叫name。
@interface
A(MyCategory)
@property
(
nonatomic
,retain)
NSString
* name;
@end
static
void
*MyNameKey =
"MyNameKey"
;
@implementation
A(MyCategory)
-(
void
)setName:(
NSString
*)name
{
objc_setAssociatedObject(
self
, MyNameKey, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(
NSString
*)name
{
return
objc_getAssociatedObject(
self
, MyNameKey);
}
@end