关联引用的使用方法

Posted 芒果味ly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关联引用的使用方法相关的知识,希望对你有一定的参考价值。

前言

这年头如果不会给现有的类添加属性,就感觉你太 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

以上是关于关联引用的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL进阶实战4,MySQL索引详解,下篇

华山论剑之 PostgreSQL sequence (下篇)

Python自动化运维之路Day8基础篇之面向对象下篇

GC优化策略-下篇

音视频开发进阶|第六讲:色彩和色彩空间·下篇

高级T-SQL进阶系列 下篇:使用 CROSS JOIN 介绍高级T-SQL