关于Objective-C Associated Objects

时间:2023-01-02 19:57:21

一、相关函数

与Associated Objects相关的函数有三个

1 void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); 

2 id objc_getAssociatedObject(id object, const void *key);

3 void objc_removeAssociatedObjects(id object);

 

其中常用的函数是前两个,第三个不经常用。

简单来说,objc_setAssociatedObject用于关联对象,objc_getAssociatedObject用来获取关联的对象,objc_removeAssociatedObjects用来移除关联的对象。

 

二、object、key、value、policy

object:你所关联的对象。

key:所用的key值(就像key有钥匙的含义,通过key,你就可以找到这个对象关联的值)

value:所关联的值。

policy:关联策略(其实就是那几个引用)。

 三、key

1.声明 static char overviewKey;,使用&overviewKey作为key值;

2.声明 static void *overviewKey = &overviewKey;,使用overviewKey作为key值;

3.用selevtor,使用getter方法的名称作为key值。

需要说明的是,key不需要赋值,只需声明。

四、关联策略

给对象添加关联对象时有五种关联策略可供选择:

关联策略 等价属性   说明
OBJC_ASSOCIATION_ASSIGN

@property (assign)

or@property (unsafe_unretained)

弱引用关联对象
OBJC_ASSOCIATION_RETAIN_NONATOMIC @property (strong, nonatomic) 强引用关联对象,且为非原子操作
OBJC_ASSOCIATION_COPY_NONATOMIC @property (copy, nonatomic) 复制关联对象,且为非原子操作
OBJC_ASSOCIATION_RETAIN @property (strong, atomic) 强引用关联对象,且为原子操作
OBJC_ASSOCIATION_COPY @property (copy, atomic) 复制关联对象,且为原子操作

 

 五.简单的代码

static char stringKey;

NSArray *array = [[NSArray alloc]initWithObjects:@"One",@"Two",@"Three", nil];

NSString * string = @"这是一个测试";

objc_setAssociatedObject(array, &stringKey, string, OBJC_ASSOCIATION_RETAIN);//在这里将string与array关联

NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &stringKey);//这里将string的值赋给associatedObject

 

 

 

 

参考链接

http://blog.leichunfeng.com/blog/2015/06/26/objective-c-associated-objects-implementation-principle/

http://blog.csdn.net/quanqinyang/article/details/38017581

欢迎有错进行纠正,一起进步。