本文引用于 雷纯锋的技术博客 ,只是摘抄了如何使用的地方,剩余的原理及实验可到此文查看。
Associated Objects 主要有以下三个使用场景:
- 为现有的类添加私有变量以帮助实现细节;
- 为现有的类添加公有属性;
- 为 KVO 创建一个关联的观察者。
相关函数
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
id objc_getAssociatedObject(id object, const void *key);
void objc_removeAssociatedObjects(id object);
- objc_setAssociatedObject 用于给对象添加关联对象,传入 nil 则可以移除已有的关联对象;
- objc_getAssociatedObject 用于获取关联对象;
- objc_removeAssociatedObjects 用于移除一个对象的所有关联对象。
key 值
函数当中的 key 必须是唯一常量,一般有以下三种定义key的方法
- 声明 static char kAssociatedObjectKey; ,使用 &kAssociatedObjectKey 作为 key 值;
- 声明 static void *kAssociatedObjectKey = &kAssociatedObjectKey; ,使用 kAssociatedObjectKey 作为 key 值;
- 用 selector ,使用 getter 方法的名称作为 key 值。
第三种省掉了一个变量名,推荐。
关联策略
在给一个对象添加关联对象时有五种关联策略可供选择:
关联策略 | 等价属性 | 说明
---|---
OBJC_ASSOCIATION_ASSIGN | @property (assign) | 弱引用关联对象
OBJC_ASSOCIATION_RETAIN_NONATOMIC | @property (strong, nonatomic) | 强引用关联对象,且为非原子操作
OBJC_ASSOCIATION_COPY_NONATOMIC | @property (copy, nonatomic) | 复制关联对象,且为非原子操作
具体使用
//
// UITableView+Property.h
// tableView
//
#import <UIKit/UIKit.h>
@interface UITableView (Property)
@property (nonatomic, copy) NSString *title;
@end
//
// UITableView+Property.h
// tableView
//
#import "UITableView+Property.h"
#import <objc/runtime.h>
@implementation UITableView (Property)
- (NSString *)title {
NSString *str = objc_getAssociatedObject(self, @selector(title));
if (str == nil) {
str = @"title";
}
return str;
}
- (void)setTitle:(NSString *)title {
objc_setAssociatedObject(self,@selector(title),title,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end