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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容