博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发 · 记——Runtime(二)交换方法
阅读量:6801 次
发布时间:2019-06-26

本文共 1585 字,大约阅读时间需要 5 分钟。

交换方法

交换方法:使用场景:系统自带的功能不够,给系统自带的方法扩展一些功能,并且保持原有的功能。 方式1:继承系统的类,重写方法 方式2:使用runtime交换方法

例如:我们现在要在控制器中加载一张图片。

//用这个方法加载图片,并不知道图片是否加载成功UIImage *img = [UIImage imageNamed:@"111"];复制代码

一般的做法,我们会给UIImage创建一个分类,先创建一个分类:UIImage+img,然后重新写一个类方法,来判断是否加载成功。

+ (__kindof UIImage *)home_imageNamed:(NSString *)imageName;复制代码
+ (__kindof UIImage *)home_imageNamed:(NSString *)imageName{    //1.加载图片    UIImage *img = [UIImage imageNamed:imageName];    //2.判断功能    if (img == nil) {        NSLog(@"加载图片为空");    }    return img;}复制代码

这样子,在控制器中,引入分类头文件,#import "UIImage+img.h",直接调用,可以实现判断是否加载成功。 但是,我们每次使用这个方法的时候,都需要导入头文件。现在我们通过runtime来实现调用imageNamed,底层调用:home_imageNamed。

在分类中,引入runtime头文件 #import <objc/message.h>, 加载分类时调用load方法。

//加载这个分类的时候调用//交换方法实现,方法都是定义在类里面+ (void)load{    NSLog(@"%s",__func__);    /*     Class:获取哪个类方法     SEL:获取方法编号,根据SEL就能去对应的类找方法     */   Method imageNamedMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));    //home_imageNamed   Method home_imageNamedMethod = class_getClassMethod([UIImage class], @selector(home_imageNamed:));        //交换方法    method_exchangeImplementations(imageNamedMethod, home_imageNamedMethod);    }复制代码
//由于运行程序就会调用load,现在交换方法成功。//在这个方法中,加载图片,得用home_imageNamed+ (__kindof UIImage *)home_imageNamed:(NSString *)imageName{    //1.加载图片    UIImage *img = [UIImage home_imageNamed:imageName];    //2.判断功能    if (img == nil) {        NSLog(@"加载图片为空");    }    return img;}复制代码

现在交换方法写好了,我们在控制器中不需要引入分类头文件,直接调用imageNamed,运行程序。

2017-01-18 13:20:47.549 [73546:6523190] +[UIImage(img) load]2017-01-18 13:20:47.596 [73546:6523190] 加载图片为空复制代码

转载地址:http://gcywl.baihongyu.com/

你可能感兴趣的文章
修改默认defatu.prop
查看>>
我的友情链接
查看>>
【技术碰撞激情,“博”出精彩人生!】2013年度IT博客大赛开幕
查看>>
KeyMob--后者居上的移动广告聚合平台
查看>>
eclipse maven source 乱码
查看>>
Linux系统下UDP发送和接收广播消息小例子
查看>>
每天尝试改变一点点!
查看>>
KNN(K-Nearest Neighbor)最邻近规则分类
查看>>
IntelliJ IDEA 2016.1破解码一枚
查看>>
metasploit ***测试笔记(meterpreter篇)
查看>>
HTTP基础
查看>>
JavaSE学习笔记(五)——类与对象
查看>>
Android之高仿飞鸽传输热点创建与搜索模块
查看>>
Struts2、Spring和Hibernate应用实例(中)
查看>>
[转]MYSQL性能优化分享(分库分表)
查看>>
用php实现异步执行任务的队列(一)
查看>>
AngularJS表单验证操作例子分享
查看>>
RabbitMQ 的安装与工作模式
查看>>
视图的跳转,ViewController的使用 。试图出现启动消失过程
查看>>
博科300光纤交换机配置手册/操作方法/密码设置/用户指南大全
查看>>