Associated Objects

2017-03-01  本文已影响9人  pzb

对象关联(或称为关联引用)本来是Objective-C 2.0运行时的一个特性;

<objc/runtime>中定义的以下三个允许你将任何键值在运行时关联到对象上的函数:

objc_setAssociatedObject

objc_getAssociatedObject

objc_removeAssociatedObjects

为什么我说这个很有用呢?因为这允许开发者对已经存在的类在扩展中添加自定义的属性,这几乎弥补了Objective-C最大的缺点

NSObject+AssociatedObject.h

@interface  NSObject  (AssociatedObject)

@property(nonatomic,strong)id associatedObject;

@end

NSObject+AssociatedObject.m

@implementationNSObject(AssociatedObject)

@dynamicassociatedObject;

- (void)setAssociatedObject:(id)object {

objc_setAssociatedObject(self,@selector(associatedObject),object,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (id)associatedObject {
    return    objc_getAssociatedObject(self,@selector(associatedObject));
}

通常推荐的做法是添加的属性最好是static char类型的,当然更推荐是指针型的。通常来说该属性应该是常量、唯一的、在适用范围内用getter和setter访问到:
static  char  kAssociatedObjectKey;
objc_getAssociatedObject(self,&kAssociatedObjectKey);
然而可以用更简单的方式实现:用selector。

删除属性
你可以会在刚开始接触对象关联时想要尝试去调用objc_removeAssociatedObjects()来进行删除操作,但如文档中所述,你不应该自己手动调用这个函数:
此函数的主要目的是在“初试状态”时方便地返回一个对象。你不应该用这个函数来删除对象的属性,因为可能会导致其他客户对其添加的属性也被移除了。规范的方法是:调用objc_setAssociatedObject方法并传入一个nil值来清除一个关联。
上一篇 下一篇

猜你喜欢

热点阅读