- 有时候,某个控件的系统提供的属性,无法满足我们的需求,那么我们就急迫的去添加某个我们所需要的属性
- 继承:继承的话,可以实现,但是有时候不太满足的我们所需
- 继承要改相应控件的class属性,若我们写出来的框架,想拿来就能直接使用,那么这个时候继承显得不是那么的合适
- 这个时候,我们想到了分类,但是默认分类里边,不能添加属性,如果要添加,则要重新设置setter,getter方法
- 这个时候runtime就用上啦
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
- 我们来用一下,比如给UIImage 添加一些属性
.h文件
#import <UIKit/UIKit.h>
//runtime 采用分类的方式动态添加属性
@interface UIImage (Extension)
//X坐标
@property (nonatomic,assign) CGFloat x;
//Y坐标
@property (nonatomic,assign) CGFloat y;
//方向 0:往右移动 1 :往左移动
@property (nonatomic,assign) int direction;
.m文件
-(void)setX:(CGFloat)x{
//需要一个对象 后边的这个X值要保存到哪个对象里面
//key:键 通过key去找Value的值
//value:值
//policy:也就是@property 的属性 用来设置 这个是X属性应该怎么操作
//@selector 如果方法名相同 计算出来的值是一样的
objc_setAssociatedObject(self, @selector(setX:), [NSString stringWithFormat:@"%f",x], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(CGFloat)x{
return [objc_getAssociatedObject(self, @selector(setX:)) floatValue];
}
//定义一个变量保存
static char imageY;
-(void)setY:(CGFloat)y{
objc_setAssociatedObject(self, &imageY, [NSString stringWithFormat:@"%f",y], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(CGFloat)y{
return [objc_getAssociatedObject(self, &imageY) floatValue];
}
-(void)setDirection:(int)direction{
objc_setAssociatedObject(self, @selector(setDirection:), [NSString stringWithFormat:@"%d",direction], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(int)direction{
return [objc_getAssociatedObject(self, @selector(setDirection:)) intValue];
}
- 大家在使用的时候,注意一下各个参数 就行了。