Runtime
动态添加属性,主要是为系统的类写分类,并且属性定义变量,可以不写策略,需要手动实现set
以及get
方法。- 在
set
方法中可以利用runtime
实现动态添加属性。 - 在
get
方法中可以利用runtime
实现属性值的获取。
为UIImage
的类目添加属性imageUrl
使用代码示例:
// UIImage+Image.h
@interface UIImage (Image)
@property (nonatomic, copy) NSString *imageUrl; // 动态添加属性
@end
// UIImage+Image.m
@implementation UIImage (Image)
#pragma mark - 动态添加属性
- (void)setImageUrl:(NSString *)imageUrl{
objc_setAssociatedObject(self, "imageUrl", imageUrl, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)imageUrl{
return objc_getAssociatedObject(self, "imageUrl");
}
@end
// 调用示例:
UIImage *image = [[UIImage alloc]init];
image.imageUrl = @"http://";
总结:
1. 动态添加属性,将会调用方法void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
为该类对应的属性进行赋值,在这个方法中存在四个参数,无返回值。
参数 | 描述 |
---|---|
id object | 给哪个对象添加属性 |
const void *key | 属性名称 |
id value | 属性值 |
objc_AssociationPolicy policy | 保存策略,这是一个枚举值。 |
保存策略枚举值:
枚举值 | 描述 |
---|---|
OBJC_ASSOCIATION_ASSIGN | 弱引用,assign |
OBJC_ASSOCIATION_RETAIN_NONATOMIC | 强引用,retain,nonatomic |
OBJC_ASSOCIATION_COPY_NONATOMIC | 强引用,copy,nonatomic |
OBJC_ASSOCIATION_RETAIN | 强引用,retain,atomic |
OBJC_ASSOCIATION_COPY | 强引用,copy,atomic |
2. 在get
方法中,将会调用方法id objc_getAssociatedObject(id object, const void *key)
获取对应的属性值,在这个方法中存在两个参数,一个泛指类型的返回值。
参数 | 描述 |
---|---|
id object | 给哪个对象添加属性 |
const void *key | 属性名称 |
返回值 | 描述 |
---|---|
id | 泛指类型的返回值 |