oc AssociatedObject (oc)

用途:

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);
}



Category的使用:

假设现在已有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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值