OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1); OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);另外还有一个方法:
OBJC_EXPORT void objc_removeAssociatedObjects(id object)__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);objc_getAssociatedObject、objc_setAssociatedObject、objc_removeAssociatedObjects都是Obj-c中的外联方法,object 参数作为待扩展的对象实例,key作为该对象实例的属性的键,而value就是对象实例的属性的值,policy作为关联的策略,它的枚举包括:
enum { OBJC_ASSOCIATION_ASSIGN = 0, OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, OBJC_ASSOCIATION_COPY_NONATOMIC = 3, OBJC_ASSOCIATION_RETAIN = 01401, OBJC_ASSOCIATION_COPY = 01403 };创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。当然,此处的关键字和关联策略是需要进一步讨论的。
下面的代码展示了如何把一个字符串关联到一个字典上:
static char overKey; NSDictionary *dictionary = @{@"Key1": @"Key1Value",@"Key2": @"KeyValue2",@"Key3": @"KeyValue3"}; NSString * overview = @"overview"; objc_setAssociatedObject(dictionary, &overKey, overview, OBJC_ASSOCIATION_RETAIN); NSString * associatedObject = (NSString *)objc_getAssociatedObject(dictionary, &overKey); NSLog(@"%@",associatedObject);
NSString * associatedObject = (NSString *)objc_getAssociatedObject(dictionary, &overKey); NSLog(@"%@",associatedObject);
断开关联
断开关联是使用objc_setAssociatedObject函数,传入nil值即可。我们可以使用如下的代码来断开字符串overview和dictionary之间的关联:
objc_setAssociatedObject(dictionary, &overKey, nil, OBJC_ASSOCIATION_ASSIGN);
其中,被关联的对象为nil,此时关联策略也就无关紧要了。
使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数
objc_setAssociatedObject(dictionary, &overKey, nil, OBJC_ASSOCIATION_ASSIGN); associatedObject = (NSString *)objc_getAssociatedObject(dictionary, &overKey); NSLog(@"%@",associatedObject);