objc_setAssociatedObject 1

[Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)

标签: objective-cios

关联

关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
    关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。

在类的定义之外为类增加额外的存储空间

使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。
    关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。

创建关联

创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。当然,此处的关键字和关联策略是需要进一步讨论的。
  ■  关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
  ■  关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。
    下面的代码展示了如何把一个字符串关联到一个数组上。

列表7-1 把一个字符串关联到一个数组

[cpp] view plaincopy

  1. static char overviewKey;
  2. NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];
  3. //为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁
  4. NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];
  5. objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
  6. [overview release];
  7. //(1) overview仍然是可用的
  8. [array release];
  9. //(2)overview 不可用

在(1)处,字符串overview仍然是可用的,这是因为OBJC_ASSOCIATION_RETAIN策略指明了数组要保有相关的对象。当数组array被销毁的时候,也就是在(2)处overview也就会被释放,因此而被销毁。如果此时还想使用overview,例如想通过log来输出overview的值,则会出现运行时异常。

获取相关联的对象

获取相关联的对象时使用Objective-C函数objc_getAssociatedObject。接着上面列表7-1的代码,我们可以使用如下代码来获取与array相关联的字符串:

[cpp] view plaincopy

  1. NSString * associatedObject = (NSString *)objc_getAssociatedObject(array, &oveviewKey);

断开关联

断开关联是使用objc_setAssociatedObject函数,传入nil值即可。
    接着列表7-1中的程序,我们可以使用如下的代码来断开字符串overview和arry之间的关联:

[cpp] view plaincopy

  1. objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);

其中,被关联的对象为nil,此时关联策略也就无关紧要了。
    使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

一个完整的实例程序

下面的程序综合了前面的代码.

[cpp] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. #import <objc/runtime.h>
  3. int main(int argc, const char* argv[])
  4. {
  5. //  NSAutoreleasePool * pool = [[NSAutoreleasePool] alloc init];
  6. static char overviewKey;
  7. NSArray *array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];
  8. //为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁
  9. NSString * overview = [[NSString alloc] initWithFormat:@"%@",@"First three numbers"];
  10. objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
  11. [overview release];
  12. NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);
  13. NSLog(@"associatedObject:%@", associatedObject);
  14. objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
  15. [array release];
  16. // [pool drain];
  17. return 0;
  18. }

更多1

时间: 2024-10-10 15:44:12

objc_setAssociatedObject 1的相关文章

[Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)

关联 关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分.    关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的. 在类的定义之外为类增加额外的存储空间 使用关联,我们可以不用修改类的定义而为其对象增加存储空间.这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用.    关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可.关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自

objc_setAssociatedObject

学习笔记:通过 objc_setAssociatedObject alert 和 button关联 及传值 标签: ios 2013-11-22 16:25 7924人阅读 评论(1) 收藏 举报  分类: ios(108)  版权声明:本文为博主原创文章,未经博主允许不得转载. //唯一静态变量key static const char associatedkey; static const char associatedButtonkey; - (IBAction)sendAlert:(id

iOS objc_setAssociatedObject 关联对象的学习

今天看了FDTemplateLayoutCell的源码,类别里面相当频繁使用了关联对象,做笔记!!!学套路 主要函数: void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); id objc_getAssociatedObject(id object, const void *key); void objc_removeAssociatedObjects

runtime之objc_setAssociatedObject/objc_getAssociatedObject

1.前言:java开发中曾经遇到过这样一种情景:使用某一个类的对象存储一个额外的信息,但是这个信息有可能是临时的,所以通过继承添加属性的方法是大才小用.我原先采用的方法是利用现在对象在这个逻辑中没有使用到的属性保存我们需要暂时保存的额外信息,然后在需要的地方再通过相应的属性取出我们保存的额外信息.这是一种解决方法. 2.现在:标题展示的runtime机制中可以很简单的解决这个问题 : 2.1我们通过objc_setAssociatedObject(id object, const void *k

objc_setAssociatedObject 关联的简单用法

1.定义:简单的说关联就是将两个对象关联起来 2.用法:加入给一个label 关联一个一个字符串keyValue 如下 1.导入头文件#import <objc/runtime.h>  动态添加的头文件添加 2.代码如下 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 70, 100, 50)]; label.text = @"799"; //给label添加一个动态的字符串keyValue ob

给类别添加属性(通过@dynamic和objc_setAssociatedObject实现)

通过@dynamic和objc_setAssociatedObject,实现给类别添加属性,前者说明:程序员手动实现setter和getter,后者则是动态给对象添加属性.两个配合使用可以实现给对象添加属性. 下面代码以scrollview为例,给scrollView添加一个refreshView属性,别的地方可以像正常属性一样使用refreshView: [头文件] @interface UIScrollView (Refresh) @property (nonatomic) RefreshV

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

属性 其实就是get/set 方法.我们可以使用  objc_setAssociatedObject/objc_getAssociatedObject  实现 动态向类中添加 方法 @interface NSObject (CategoryWithProperty) @property (nonatomic, strong) NSObject *property; @end @implementation NSObject (CategoryWithProperty) - (NSObject *

[Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)(转)

转载自:http://blog.csdn.net/onlyou930/article/details/9299169 分类: Objective-C2013-07-11 11:54 3420人阅读 评论(0) 收藏 举报 关联 关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分.    关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的. 在类的定义之外为类增加额外的存储空间 使用关联,我们可以不用修改类的定义而为其对象增加存储空间.这在我们无法访问到类

iOS - Objective-C 关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)

关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分. 关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的. 在类的定义之外为类增加额外的存储空间 使用关联,我们可以不用修改类的定义而为其对象增加存储空间.这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用. 关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可.关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会