在分类中,我们使用@property 并不会自动生成实例变量以及存取方法,所以一般使用关联对象为已存在的类添加属性。
对于objc_getAssociatedObject我们看官方的APi
OBJC_EXPORT void
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
id _Nullable value, objc_AssociationPolicy policy)
OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0);
1.第一个参数:
id object
: 需要传入的是 : 对象的主分支2.第二个参数: const void *key
: 是一个 static 类型的 关键字,这里根据开发者自身来定义就行(尽量写的有根据一点,避免以后忘记是干啥用的) 也可以使用@selector(categoryProperty) 来代替。这种写法省略了生命参数的代码,并且能很好地保证key值的唯一性。3.第三个参数: id value
: 传入的是: 对象的子分支4.第四个参数: objc_AssociationPolicy policy
:是当前关联对象的类型 strong,weak,copy 关于引用计数的方法 ,大家可以看相关的只是接下来切入正题看具体如何看往一个分类中添加属性,
首先引入
#import
我们要利用其中的
@interface NSObject (CategoryWithProperty)
@property (nonatomic, strong) NSObject *property;
@end
@implementation NSObject (CategoryWithProperty)
- (NSObject *)property {
return objc_getAssociatedObject(self, @selector(property));
}
- (void)setProperty:(NSObject *)value {
objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
动态的添加属性
#import "UILabel+Associate.h"
#import <objc/runtime.h>
@implementation UILabel (Associate)
static char flashColorKey;
- (void) setFlashColor:(UIColor *) flashColor{
objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIColor *) getFlashColor{
return objc_getAssociatedObject(self, &flashColorKey);
}
@end
断开关联
断开关联是使用objc_setAssociatedObject函数,传入nil值即可。
使用函数objc_removeAssociatedObjects可以断开所有关联