Objective-C – 关联引用
来源:互联网 发布:mac 音量快捷键 编辑:程序博客网 时间:2024/05/27 09:47
http://www.ycoder.com/2011/09/objective-c-associative-references关联引用/
你可以使用关联引用模拟在已存在的类上添加对象参数,这个功能只在Mac OS X v10.6和以上版本支持
在类外添加存储
使用关联引用,你可以对一个对象添加数据而不需要修改这个类定义,这在你没有这个类的源代码时很有用,或者是为了二进制兼容的原因你无法修改这个对象的时候。
关联基于一个key,所以你可以在一个对象上添加多个关联,每个使用不同的key,关联对象也可以确保被关联的对象是否存在,至少在源对象的生命周期内(也就是说这个对象没有将被引入到垃圾回收系统的可能性)
创建关联
你可以使用方法 objc_setAssociatedObject 创建一个关联,这个方法有四个参数,源对象,key,值,关联方式,key和关联方式值得进一步说明
- key是一个 void 指针,必须唯一,通常使用static变量
- 方式指关联对象是否转让,保留还是复制,关联是按原子级还是非原子级,这与声明属性的元属性类似( “Property Declaration Attributes”),你可以使用一个常量(见 objc_AssociationPolicy)来指定这种联系的方式
下面的例子显示如何建立一个数组和一个字符串之间的关联
Listing 7-1 Establishing an association between an array and a string
1
static
char
overviewKey;
2
NSArray *array = [[NSArray alloc] initWithObjects:@
"One"
, @
"Two"
, @
"Three"
, nil];
3
// For the purposes of illustration, use initWithFormat: to ensure the string can be deallocated
4
NSString *overview = [[NSString alloc] initWithFormat:@
"%@"
, @
"First three numbers"
];
5
6
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
7
8
[overview release];
9
// (1) overview valid
10
[array release];
11
// (2) overview invalid
在(1)处,字符串 overview 依然存在,因为使用的保留方式,指定array保留关联对象,但是在(2)处,当array被释放时,overview也会被释放。
检索关联对象
使用Objective-C运行器的objc_getAssociatedObject函数检索关联对象,继续上面的例子,使用下面的代码,你可以从这个数组中获取关联的overview对象:
1
NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);
打断关联
打断关联,你可以调用objc_setAssociatedObject,传入nil作为参数
继续上面的例子,使用下面的代码,你可以打断这个数组与字符串的关联:
1
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
(鉴于关联对象设置为了 nil,policy也就是第四个参数实际上不再重要)
打断对象的所有关联可以用objc_removeAssociatedObjects,总的来说,不提倡打断对象的所有关联,除非你希望对象回到原始状态。
完整示例
下面的程序整合了前面章节的代码示例
1
#import
2
#import
3
4
int
main (
int
argc,
const
char
* argv[]) {
5
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
6
7
static
char
overviewKey;
8
9
NSArray *array = [[NSArray alloc] initWithObjects:@
"One"
, @
"Two"
, @
"Three"
, nil];
10
// For the purposes of illustration, use initWithFormat: to ensure we get a
11
// deallocatable string
12
NSString *overview = [[NSString alloc] initWithFormat:@
"%@"
, @
"First three numbers"
];
13
14
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
15
[overview release];
16
17
NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);
18
NSLog(@
"associatedObject: %@"
, associatedObject);
19
20
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
21
[array release];
22
23
[pool drain];
24
return
0;
25
}
- Objective-C – 关联引用
- Objective-C – 关联引用
- Objective-C – 关联引用
- Objective-C关联引用
- Objective-C关联引用
- Objective-C Associative References(关联引用)
- Objective-C Associative References(关联引用) 续
- Objective-C Associative References(关联引用)
- Objective-C Associative References(关联引用) 续:相关实践
- Objective-C Associative References(关联引用)- 实践
- objective-c中关联引用的底层实现
- Objective-C 关联引用的实例 (59)
- objective-c关联
- [Objective-C]关联
- objective-c 引用计数
- Objective-c 循环引用
- Objective-C 引用计数
- Objective-C向前引用
- 四种简单的排序算法
- JavaScript 中 undefined 与 undeclared 之间的区别?
- 如何不允许调用对象的拷贝构造函数和赋值运算符
- DSB,ISB,DMB指令
- java中的多线程
- Objective-C – 关联引用
- C#项目的.settings文件中的自定义类型(及其数组)的配置步骤
- 智能指针(SP,WP)的使用条件
- C#连接MySql的小封装
- java程序员面试必备的32个要点
- Android核心分析之一
- TLB快表的作用
- 网管系统Hyperic HQ监控APC SmartUPS
- android carema 源码学习