Category添加属性(关联)

今天看HHRouter源码的时候看到这两句:


- (void)setParams:(NSDictionary *)paramsDictionary
{
    objc_setAssociatedObject(self, &kAssociatedParamsObjectKey, paramsDictionary, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSDictionary *)params
{
    return objc_getAssociatedObject(self, &kAssociatedParamsObjectKey);
}

其中 objc_setAssociatedObject和objc_getAssociatedObject的用法让我费解,因为在我记忆中觉得category是只能为现有类增加方法,不能增加实例变量的。
google一下发现原来系统早就提供了Associative References,使用它(关联)我们可以在runtime时添加属性。
runtime API

OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

明白用法之后再回到HHRouter源码,其中 &kAssociatedParamsObjectKey对应的是const void *key,key仅仅只是一个地址,所以使用传入&。而代码中的“OBJC_ASSOCIATION_RETAIN_NONATOMIC”对应的是API中的policy,它跟属性的retain、assign、copy是保持一致的,所以源码中使用了RETAIN_NONATOMIC。
以上内容作为学习笔记,感谢“编程小翁“的文章借鉴:http://www.cnblogs.com/wengzilin/p/4331685.html?utm_source=tuicool

你可能感兴趣的:(Category添加属性(关联))