Runtime

  • 有时候,某个控件的系统提供的属性,无法满足我们的需求,那么我们就急迫的去添加某个我们所需要的属性
  • 继承:继承的话,可以实现,但是有时候不太满足的我们所需
    • 继承要改相应控件的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];
}
  • 大家在使用的时候,注意一下各个参数 就行了。

你可能感兴趣的:(框架,控件)