Objective-C中的关联(objc_setAssociatedObject,objc_getAssociatedObject,objc_removeAssociatedObjects)
关联的概念
所谓的关联,字面意思是把两个相关的对象放在一起,实际也是如此。把两个对象相互关联起来,使得其中的一个对象成为另外一个对象的一部分,这就是关联。
关联的作用
使用Category,我们可以给一个类增加方法,而不用修改类文件本身。使用关联,我们就可以在类之外为类增加额外的存储空间,跟使用Category一样,不需要修改类文件本身。关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个关联都使用不同的关键字即可。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。
关联的创建
创建关联需要使用Objc的运行时函数:objc_setAssociatedOjbect来把一个对象和另外一个对象进行关联,所以需要导入头文件<objc/runtime.h>。该函数需要四个参数:源对象、关键字、关联的对象、关联策略。
关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都会采用静态变量来作为关键字。
关联策略表明了相关的对象是通过赋值、保留引用还是赋值的方式来进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过预先定义好的常量来表示的。
下面的代码展示了如何把一个字符串关联到一个数组上。
static char overViewKey; NSArray * array = [@[@"One",@"Two",@"Three"] retain];
NSString * overView = [[NSString alloc] initWithFormat:@"First three number"];
objc_setAssociatedObject(array, &overViewKey, overView, OBJC_ASSOCIATION_RETAIN); [overView release];//(1) overView仍然是可用的
[array release]; //(2) overView不可用
在(1)处,字符串仍然是可用的,这是因为OBJC_ASSOCIATION_RETAIN策略指明了数组要持有相关的对象。当数组array被销毁的时候,也就是在(2)处,overView也就会被释放,因此而被销毁。如果此时还想使用overView,例如想通过NSLog来输出overView的值,则会出现异常。
获取相关的对象
获取相关的对象时使用Objc的函数obc_getAssociatedObject。
NSString * associatedOjbect = (NSString *)objc_getAssociatedObject(array, &overViewKey);
关联的断开
断开关联时使用objc_setAssociatedOjbect,传入nil值即可。如:
objc_setAssociatedObject(array, &overViewKey, nil, OBJC_ASSOCIATION_ASSIGN);
其中,被管理啊你的对象为nil,此时的关联策略也就无关紧要了。
使用函数objc_removeAssociatedOjbects可以断开所有的关联。通常情况下不建议使用这个函数,因为它会断开所有的关联。只有在需要把对象回复到原始状态的时候才会使用这个函数。
一个完整的示例程序
#import <Foundation/Foundation.h>
#import <objc/runtime.h> int main(int argc, const char * argv[])
{ @autoreleasepool { static char overviewKey;
NSArray * array = [@[@"One",@"Two",@"Three"] retain];
NSString * overview = [[NSString alloc] initWithString:@"First three nubmers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
[overview release]; NSString * associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);
NSLog(@"associatedObject:%@",associatedObject); objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN); [array release]; }
return ;
}
来自:http://blog.csdn.net/onlyou930/article/details/9299169,略有修改
Objective-C中的关联(objc_setAssociatedObject,objc_getAssociatedObject,objc_removeAssociatedObjects)的更多相关文章
- objective-c 中的关联介绍
objective-c 中的关联介绍 转载请注明CSDN博客上的出处: http://blog.csdn.net/daiyibo123/article/details/46471993 如何设置关联 ...
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
属性 其实就是get/set 方法.我们可以使用 objc_setAssociatedObject/objc_getAssociatedObject 实现 动态向类中添加 方法 @interfac ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- Django model中 双向关联问题,求帮助
Django model中 双向关联问题,求帮助 - 开源中国社区 Django model中 双向关联问题,求帮助
- 转:如何在 LoadRunner 脚本中做关联 (Correlation)
如何在 LoadRunner 脚本中做关联 (Correlation) 当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本.在V ...
- 在Eclipse中如何关联源代码
我们就以Struts2框架为例,展示在Eclipse中如何关联源代码.例如,在Struts2框架的学习中,我们有时需要查看ActionSupport这个类的源码,这个时候就要在Eclipse中关联源代 ...
- TSQL:A表字段与B表中的关联,关联条件中一列是随机关联的实现方式
A表字段与B表中的关联,关联条件中一列是随机关联的实现方式 create table test( rsrp string, rsrq string, tkey string, distan strin ...
- objective C中的字符串NSStirng常用操作
objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...
随机推荐
- jQuery的动画方法
/* animate参数: 参数一:要改变的样式属性值,写成字典的形式 参数二:动画持续的时间,单位为毫秒,一般不写单位 参数三:动画曲线,默认为‘swing’,缓冲运动,还可以设置为‘linear’ ...
- C3P0连接池工具类使用
c3p0的基本连接配置文件 c3p0-config.xml <c3p0-config> <default-config> <property name="dri ...
- poj 2546(两圆公共面积)
Circular Area Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5682 Accepted: 2225 Des ...
- AC日记——Maximal GCD codeforces 803c
803C - Maximal GCD 思路: 最大的公约数是n的因数: 然后看范围k<=10^10; 单是答案都会超时: 但是,仔细读题会发现,n必须不小于k*(k+1)/2: 所以,当k不小于 ...
- MSSQL-字符串分离与列记录合并成一行混合使用
一般我们在数据库的表字段存储字典Id,如果有多个的话一般是用,或分隔符分隔(12,14),列表显示的时候是显示字典名,那如果要在数据库将字典Id转成用户看得懂的字典名,该怎么办呢? 我们这时候可以结合 ...
- 阿里最新出的图书《码出高效:Java开发手册》宣传手册图片里出了比较搞笑的错误,大家没有发现?
- (30)C#Timer类
有三种Timer 1.System.Windows.Forms.Timer 应用于WinForm中,它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程 ...
- 陕西师范大学第七届程序设计竞赛网络同步赛 F WWX的礼物【数学/k进制下x^n的位数/log】
链接:https://www.nowcoder.com/acm/contest/121/F来源:牛客网 题目描述 WWX的女朋友送给了他一个礼物,可是礼物却被一把K进制密码锁锁住了.在礼物盒上还有一张 ...
- luogu P1446 [HNOI2008]Cards
题目链接 luogu P1446 [HNOI2008]Cards 题解 题意就是求染色方案->等价类 洗牌方式构成成了一个置换群 然而,染色数限制不能用polay定理直接求解 考虑burnsid ...
- [LOJ6277]数列分块入门 1
题目大意: 给你一个长度为$n(n\leq 50000)$的序列$A$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数加上$c$: 2.询问$A_r$的值.思路: 分块. 对于整块的数据打标 ...