通常我们需要添加新的方法时,会给一个类添加分类,这样我们可以动态的为原有类添加新的方法,而不需要继承原有类,提高了执行效率。但是分类只能添加方法,不能添加属性,那么我们需要给分类添加属性的时候就可以用到关联对象了。
关联对象有下面这几种方法:
/**
* 设置关联对象
*
* @param 需要被关联的对象
* @param key 关联对象的key 一般这样设置static char key;
* @param value 被关联对象的属性,如果设置nil,就取消关联
* @param policy 关联策略,相当于属性的内存管理语义
*/
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
/**
* 获取关联对象
*
* @param object 被关联的对象
* @param key 关联对象的key
*
* @return 返回关联属性的值
*
* @see objc_setAssociatedObject
*/
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);
例如,给NSObject (AssociatedObject)添加关联属性
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, _cmd);
}
这样只需要给关联对象赋值就可以了
NSString *str = @"associatedString";
str.name = @"mm";