您的位置:首页 > 其它

关联引用的使用方法

2016-03-26 20:38 176 查看

前言

这年头如果不会给现有的类添加属性,就感觉你太 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: