Objective-C 关联
在项目开发中,经常会使用到关联,就是将两个实例对象绑定,使得其中一个实例对象成为另一个实例对象的一部分。关联特性在mac os 10.6 及ios 3.1以上才可以使用。
关联的使用是基于关键字来实现,也就是说一个对象可以使用不同的关键字来实现随意多的关联。另外关联可以保证被关联者在关联对象的生命周期中都可以使用。
对于关联的使用,分为创建关联,获取关联对象,解除关联。下面我就会对于以上三个环节进行相应的讲解。
1.创建关联
在使用关联的时候,是需要引用#import <objc/runtime.h> 头文件(运行时函数),在创建关联的时候是使用objc_setAssociatedObject来实现的。
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。
关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。分为:OBJC_ASSOCIATION_ASSIGN ,OBJC_ASSOCIATION_RETAIN_NONATOMIC ,OBJC_ASSOCIATION_COPY_NONATOMIC,OBJC_ASSOCIATION_RETAIN , OBJC_ASSOCIATION_COPY 。实例如下:
static char overviewKey;
NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];
NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
以上代码就将array和overview关联在一起。创建完关联,我们会在其它的地方要通过overviewKey来获取overview,那接下来,我们要分析分析,我们该怎么样来通过overviewKey来获取overview。
2.获取关联对象
获取相关联的对象时使用Objective-C函数objc_getAssociatedObject(id object, const void *key),对应的参数就是关联者和关联关键字。代码实例如下
NSString *overview = objc_getAssociatedObject(array,overviewKey);
3.断开关联
断开关联有两种方法,首先,断开所有的关联我们可以采用objc_removeAssociatedObjects方法。基本上不大建议这种方法,因为这种方法将该对象的其它的相应的关联也给断开了,在项目中应用可能会带来一些以外的bug,并且可能调试起来比较麻烦。那我们平时需要做的就是通过什么关键字段来建立的关联,我怕们就应该断开我们创建的关联。那这种方法我们使用的是objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);我们给关联者关联一个nil值。关联策略无所谓,问题都不大。
以上是我在项目中使用的一些心得,基本上能够满足一般的项目需求。
Objective-C 关联的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- 【iOS】关联属性存取数据
有时候我们需要在现有的类存放一些额外的信息,通常的做法是继承一个子类,然后定义新增加的属性,然而如果我们为每个需要的类都添加一个类显得太麻烦了,objc提供了一个关联属性的特性,可以给一个对象关联一个 ...
- Objective C Runtime 开发介绍
简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...
- Hibernatel框架关联映射
Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- UML类图(下):关联、聚合、组合、依赖
前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...
- Entity Framework 6 Recipes 2nd Edition(12-5)译 -> 自动删除相关联实体
12-5. 自动删除相关联实体 问题 当一个实体被删除时,你想自动删除它相关联的实体 解决方案 假设你有一个表结构由一个course (科目), course 的classes (课程),以及enro ...
- hibernate多对一单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- 关于for循环删除数组内容出现的问题
昨天用for循环进行数组去重的时候出现的问题, 首先,用双重for循环把前一个和所有后面的元素进行比较,如果相等则删除. 但是,如果数组里面有三个以上连续相等的元素的时候,就会出现问题. var ar ...
- vs2010 A selected drive is no longer valid
visual studio 2010重新安装添加组件,报A selected drive is no longer valid错误. 这个是由于已经安装了sp1,此时需要将sp1卸载掉,然后就可以安装 ...
- BPTT算法推导
随时间反向传播 (BackPropagation Through Time,BPTT) 符号注解: \(K\):词汇表的大小 \(T\):句子的长度 \(H\):隐藏层单元数 \(E_t\):第t个时 ...
- 快速排序 - C语言
看了这本<数据结构与算法分析>中的快速排序. 写下自己理解后的代码,以备后用. #include "stdio.h" void insertSort(int arr[] ...
- apache和nginx开启https
1.安装mod_ssl和openssl yum -y install mod_ssl openssl 2.建立服务器密钥 mkdir /etc/httpd/conf.d/ssl.key/ cd /et ...
- nginx url 重写
rewrite ^([^\.]*)/platform/(.+)/(.+)-(.+)\.html$ $1/platform.php?mod=asklist&ym=$2&fl=$3& ...
- Zepto 实现checkbox全选与全不选状态切换
最近项目里用到foundation,而foundation4默认集成了Zepto,很多轮子要重造,所以有了下面的代码. <script> /** * Muti-Checking-Toggl ...
- 【转】webGL与OpenGL的不同
原链接 http://www.khronos.org/webgl/wiki/WebGL_and_OpenGL_Differences WebGL and OpenGL Differences ...
- STM32之独立看门狗与窗口看门狗总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
- sublime text3使用小结
一.下载 http://www.sublimetext.com/2 sublime text2下载页 http://www.sublimetext.com/3 sublime text3下载页 ...