对象关联(Associated Object)
经常看片的小伙伴肯定听一群坏蛋说过这一句话,我们还会回来的~~咳咳,不好意思,说错了,是我们是绑在一条绳子上的蚂蚱。而这个跟我们今天说的主题有点像,因为我们是要将一个对象绑定到另一个对象上~
那么不废话,新来看看今天的素材都有哪些吧:
// <objc/runtime.h>
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/runtime.h>
知道如果要用要建立关联的话,首先要引入这个头文件。其次,在iOS4以及OS X 10.6以后提供了这三个API,而这三个API有点类似NSDictionary(或者Dictionary)的key:value模式,只不过这里需要指定需要绑定哪个对象上。
这样说好像有点乏味,我们拿一个开源库里面最牛逼库之一的AFN里面的代码来看下:
@interface UIImageView (_AFNetworking)
@property (readwrite, nonatomic, strong, setter = af_setActiveImageDownloadReceipt:) AFImageDownloadReceipt *af_activeImageDownloadReceipt;
@end
@implementation UIImageView (_AFNetworking)
- (AFImageDownloadReceipt *)af_activeImageDownloadReceipt {
return (AFImageDownloadReceipt *)objc_getAssociatedObject(self, @selector(af_activeImageDownloadReceipt));
}
- (void)af_setActiveImageDownloadReceipt:(AFImageDownloadReceipt *)imageDownloadReceipt {
objc_setAssociatedObject(self, @selector(af_activeImageDownloadReceipt), imageDownloadReceipt, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
可以看得出,这里使用了Associated Object
为UIImageView的Category添加了一个新的属性。其实这个也是Associated Object
最常用的场景,就是为Category添加属性。总所周知,在Objective-C中的Category是没有办法添加新的属性,这个可以说是一个非常麻烦的地方,因为我们经常为一个已经存在的类中希望添加一个属性来完善这个类新添加的功能。
But,苹果不如我们意啊,竟然不给我们权限为Category添加属性,然后程序员是伟大的,老是能找到方法搞小动作。
其实整体用法上面就可以看到了,这里最后说一句,关于其中的key,通常的做法有两种,一种是通过属性的getter方法的@selector作为key(比如上面的方式),还有一种方式通过一个静态变量的地址作为key,比如下面的方式:
static char kAssociatedObjectKey;
objc_getAssociatedObject(self, &kAssociatedObjectKey);
好了,到此为止吧。好像这节没什么代码~别打我哟
PS:具体代码可以从Github上获取。
如有问题或纠正, 可以联系@叫什么都不如叫Pluto-Y或在Github