关联引用的使用方法
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
相关文章推荐
- 展示图片的自动和手动切换
- 矩阵快速幂 ZOJ 3497 Mistwald
- 表空间
- 异常处理方法
- json 数组对象 取值
- 常见图表元素
- Android开源库
- 【BZOJ1005】【HNOI2008】明明的烦恼
- Wolfram Mathematic流程控制
- 比较经典的中断串口接收方法
- Java静态内部类,普通内部类的理解
- 从此不求人:自主研发一套PHP前端开发框架(7)
- Java——UDP
- tableview懒加载崩溃
- 数据分析文件操作的命令行
- 表管理
- 第四次上机实践项目-项目1-三角形类锥形-(2)
- C++作业2
- Yii CGridView 基本使用(三)关联表相关字段搜索
- 同意按钮,倒计时10秒,同意按钮变为可提交的