关联的概念

  所谓的关联,字面意思是把两个相关的对象放在一起,实际也是如此。把两个对象相互关联起来,使得其中的一个对象成为另外一个对象的一部分,这就是关联。

关联的作用

  使用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)的更多相关文章

  1. objective-c 中的关联介绍

    objective-c 中的关联介绍 转载请注明CSDN博客上的出处: http://blog.csdn.net/daiyibo123/article/details/46471993 如何设置关联 ...

  2. category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性

    属性 其实就是get/set 方法.我们可以使用  objc_setAssociatedObject/objc_getAssociatedObject  实现 动态向类中添加 方法 @interfac ...

  3. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  4. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  5. Django model中 双向关联问题,求帮助

    Django model中 双向关联问题,求帮助 - 开源中国社区 Django model中 双向关联问题,求帮助

  6. 转:如何在 LoadRunner 脚本中做关联 (Correlation)

    如何在 LoadRunner 脚本中做关联 (Correlation) 当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本.在V ...

  7. 在Eclipse中如何关联源代码

    我们就以Struts2框架为例,展示在Eclipse中如何关联源代码.例如,在Struts2框架的学习中,我们有时需要查看ActionSupport这个类的源码,这个时候就要在Eclipse中关联源代 ...

  8. TSQL:A表字段与B表中的关联,关联条件中一列是随机关联的实现方式

    A表字段与B表中的关联,关联条件中一列是随机关联的实现方式 create table test( rsrp string, rsrq string, tkey string, distan strin ...

  9. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

随机推荐

  1. bash shell 文本文件操作

    一.打开文本文档,查看文本的内容,我们最直观的方式就是用编辑器,并且可以使用vi内部的查找命令查找[参见Vim文字编辑] vi test.txt#使用vi打开当前目录下的test.txt文本 二.总结 ...

  2. 如何在 GitHub 建立个人主页和项目演示页面

    Git.GitHub.TortoiseGit ?http://www.cnblogs.com/guyoung/archive/2012/02/18/8030-.html GitHub Github官网 ...

  3. (1)Java Spring

    Spring 4种关键策略: 基于POJO的轻量级和最小侵入编程 通过依赖注入和面向接口实现松耦合 基于切面和惯例进行声明式编程 通过切面和模板减少样板式代码

  4. 51nod 1094 和为k的连续区间【前缀和/区间差/map】

    1094 和为k的连续区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 一整数数列a1, a2, ... , an(有正有负),以及另一个整数k ...

  5. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- Red Rover

    链接:https://www.nowcoder.com/acm/contest/116/A来源:牛客网 输入描述: Input consists of a single line containing ...

  6. ST表【p1311】 选择客栈

    题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0~k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  7. CSS 标准发布流程

    随着 CSS 3 的广泛应用,很多新的 CSS 属性层出不穷,有很多陌生的 CSS 属性出现,所以经常需要去学习新的 CSS 属性.新的属性往往介绍文章不多,所以有时候就需要去看看官方文档,此时会发现 ...

  8. 【微信】微信小程序 获取本次场景值

    场景值: 代表从何处进入小程序的.代表小程序的入口场景值. 注意: 1>目前仅可以在 App 的 onlaunch 和 onshow 中获取上述场景值 获取场景值的方法: //在小程序的onLa ...

  9. nginx rewrite不支持if 嵌套也不支持逻辑或和逻辑并

    如题,apache的rewrite是支持或者的,用个OR就可以,如果不加OR,多个RewriteCond 罗列累加就是并且的意思.然后nginx的rewrite就没有这么好了.那么如何去实现这样复杂的 ...

  10. HTML5的测试总结

    HTML5其实也是web的一种,所以基本的web测试的一些重点,HTML5上都要过一遍,不过也有其特殊之处. [需求设计测试] 需求是否合理.是否有更好的实现方法或者功能的遗漏,以及原型图测试,包括用 ...