Category添加属性(关联)

本文解析了Objective-C中使用关联引用实现动态属性的方法,重点介绍了objc_setAssociatedObject和objc_getAssociatedObject函数的用法,以及它们如何在HHRouter源码中被应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本博客迁移来自:http://www.jianshu.com/users/465865c268ed/latest_articles
今天看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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值