美文网首页
Category添加属性(关联)

Category添加属性(关联)

作者: voidxin | 来源:发表于2016-08-24 15:33 被阅读35次

    今天看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添加属性(关联)

          本文链接:https://www.haomeiwen.com/subject/nqhosttx.html