关联引用的使用方法

前言

这年头如果不会给现有的类添加属性,就感觉你太 low 了点,光知道通过类别添加、覆盖方法是不够的,有的时候我们真的需要给已有类添加个酸爽的属性,这个类可以是系统的类,也可以是自己写的类,没什么限制!

  • 关联引用的使用很是广泛,比如我们熟知的 SDWebImage,下拉刷新控件,YYKit…
  • 我 14 年看 EGO 下拉刷新实现的时候发现了这种用法,那是我第一次接触,以后就屡试不爽啦…
  • 关联引用的使用很是简单,这里不多说,写个简单的例子看下吧…

假如现有工程里已经有个类 SingletonObject,我想给他加个属性,我们知道类别是不可以加属性的,这里就要使用 Runtime 的技术了—关联引用;

1.第一步创建个类别文件,声明一个静态变量,用于被关联对象的和次对象产生关系;


static char keyAddress;

@implementation SingletonObject (association)
@end

2.导入头文件:#import

- (void)setTestAddNum:(NSNumber *)testAddNum
{
    objc_setAssociatedObject(self, &keyAddress, testAddNum, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSNumber *)testAddNum
{
   NSLog(@"@implementation之外的 association key:%p",&keyAddress);
   NSNumber *value = objc_getAssociatedObject(self, &keyAddress);
   return value;
}

3.把 getter 和 setter 方法暴漏到头文件中就行了,不过我们习惯了属性,因此我描述了一个属性;

@interface SingletonObject (association)

//通过关联引用给 SingletonObject加上一个 testAddNum 属性;
@property (nonatomic, retain) NSNumber *testAddNum;

@end

4.这就OK啦,测试下吧:

SingletonObject *single = [SingletonObject sharedInstance];
single.testAddNum = @(3597);
NSLog(@"---%@",single.testAddNum);

结果必须是打印“—3597”啦!

5.这里我写的是个单例类,不过没关系啦,单利只是保证只有一个对象而已,我给这个对象关联一个 num 对象是木有问题的!

总结

关联引用+类别 有着继承无法比拟的优势!不需要创建新类就可以增加新的属性和方法,对于已有类没有侵害,不用修改继承体系!并且使用关联引用无需管理内存,详细的内部实现介绍请看下篇博客:浅析关联引用

测试工程的地址:https://github.com/debugly/StudyAssociationSourceCode

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值