ios Runtime的几种常见用途

本文介绍了Objective-C Runtime的几个实战应用,包括方法交换实现动态行为调整,拦截系统方法实现屏幕适配,自定义属性,字典转模型,以及控制器动态跳转。通过这些示例,展示了Runtime的强大灵活性。
摘要由CSDN通过智能技术生成

1. 动态的交换(类方法)

- (void)viewDidLoad {

 [super viewDidLoad];

 [SecMainViewController run];

 [SecMainViewController jump];

    //这打印的是跑和跳 

    MethodnewRun     =class_getClassMethod([SecMainViewControllerclass],@selector(run));

    MethodnewJump     =class_getClassMethod([SecMainViewControllerclass],@selector(jump));

    method_exchangeImplementations(newRun, newJump);

    [SecMainViewController run];

    [SecMainViewController jump];

      //交换之后 打印的是跳 和 跑

}

+(void)run {

    NSLog(@"跑");

}

+(void)jump {

    NSLog(@"跳");

}

2.拦截系统方法(以动态适配屏幕字体和大小为例子)

步骤:

1、为UIFont建一个分类(UIFont+Category)

2、分类中重写UIFont的load方法,实现方法的交换(只要能让其执行一次方法交换语句,load再合适不过了)

    // 获取替换后的类方法

    Method newMethod     =class_getClassMethod([self class],@selector(adjustFontName:size:));

    // 获取替换前的类方法

    Method method =class_getClassMethod([self class],@selector(fontWithName:size:));

    // 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)

    method_exchangeImplementations(newMethod, method);

    }

3.实行自定义的adjustFontName:size方法

+ (UIFont*)adjustFontName:(NSString*)name size:(CGFloat)fontSize{

    UIFont*newFont =nil;

    newFont = [UIFontadjustFontName:namesize:fontSize *     [UIScreenmainScreen].bounds.size.width/MyUIScreen];

    return newFont;

}

注意:自定义方法中最后一定要再调用一下系统的方法,让其有设置font的功能,但是由于方法交换,系统的方法名已经变成了我们自定义的方法名(有点绕,就是用我们的名字能调用系统的方法,用系统的名字能调用我们的方法),这就实现了系统方法的拦截!

3.在分类中设置属性,给任何一个对象设置属性

步骤:

1、创建一个分类,比如给任何一个对象都添加一个name属性,就是NSObject添加分类(NSObject+Category)

2、先在.h 中@property 声明出get 和 set 方法,方便点语法调用

@property(nonatomic,copy)NSString*name;

3、在.m 中重写set 和 get 方法,内部利用runtime 给属性赋值和取值

char nameKey;

- (void)setName:(NSString*)name {

// 将某个值跟某个对象关联起来,将某个值存储到某个对象中

objc_setAssociatedObject(self, &nameKey, name,OBJC_ASSOCIATION_COPY_NONATOMIC);

}

- (NSString*)name {

return objc_getAssociatedObject(self,&nameKey)

}

4.实现字典和模型的自动转换

(核心就是可以遍历出字典中的每个属性,json解析中大牛框架都用了这个特性,包括MJEXtension,YYModel,jsonModel都是将json转换为字典,再遍历字典中的每个属性来进行modle的转换) 

5.实现万能控制器跳转

产品来一变态需求,推送过来的消息,要跳转到任意控制器.利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了

6.Jspath 热更新 

使用运行时,jspatch 基本上算是黑科技,在线修复版本bug,微信都使用了这个技术,详情百度“JSPatch”,此处省略30000字

总结了几种常见runtime使用,希望对大家有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值