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值。关联策略无所谓,问题都不大。

  以上是我在项目中使用的一些心得,基本上能够满足一般的项目需求。

 

 

原文地址:https://www.cnblogs.com/xishui2011/p/3681918.html