您的位置:首页 > 其它

Runtime

2015-11-23 18:54 204 查看
有时候,某个控件的系统提供的属性,无法满足我们的需求,那么我们就急迫的去添加某个我们所需要的属性

继承:继承的话,可以实现,但是有时候不太满足的我们所需

继承要改相应控件的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];
}


大家在使用的时候,注意一下各个参数 就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  框架 控件