前言
Objective-C 不能动态的添加一些属性到对象上,和其他的一些原生支持这点的语言不一样。所以之前你都不得不努力为未来要增加的变量预留好空间。在 Mac OS X 10.6 中,Objective-C 的 Runtime 已经原生的支持这个功能了。
OC runtime 中关联对象的方法相信大家都使用过,但是其原理和内部实现就很多人不知道。这篇文章就来讲解一下 OC runtime 之关联对象,下面直接步入正题。
runtime 关联对象原理
runtime 中提供的 API 如下:
/// 对象关联策略
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = 0, /**< 关联一个弱引用 */
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< 指定关联一个强引用. 非原子性. */
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< 指定关联一个拷贝引用. 非原子性. */
OBJC_ASSOCIATION_RETAIN = 01401, /**< 指定关联一个强引用.原子性. */
OBJC_ASSOCIATION_COPY = 01403 /**< 指定关联一个拷贝引用.原子性. */
};
/**
* 用给定的 key 和关联策略 policy 为指定的 object 设置关联关系
*/
void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy);
/**
* 通过给定的 object 和 key 拿到关联的对象
*/
id objc_getAssociatedObject(id object, const void * key);
/**
* 移除给定 object 所有关联的关系
*/
void objc_removeAssociatedObjects(id object);
runtime 的 API 很简单,实际上工作中使用 runtime 的关联对象也很方便,如下:
static const void * _Nonnull titleKey = @"titleKey";
- (void)setTitle:(NSString *)title
{
objc_setAssociatedObject(self, titleKey, key, OBJC_ASSOCIATION_RETAIN);
}
- (NSString *)title
{
return objc_getAssociatedObject(self, titleKey);
}
如此简单强大的功能,如果想要观察系统的实现,可以找关联对象的源码,我们可以从objc 源码中拿到,










