最近想找有关Runtime的文章,找了好久都不太满意,讲解的模糊不清,偶然的机会发现了一个一行代码,足解决大家所有有关Runtime问题的方法,废话不多说在此奉上OC_runtime运行时官方文档翻译_IThao123 - IT行业第一站
在这里简单给大家说下Runtime的部分功能,
首先,Runtime是一套底层的C语言API(包含强大的C语言数据类型和函数)
OC代码都是基于Runtime实现的,即编写的OC代码最终都会转成Runtime的代码,
例如
HCPerson *person = [HCPerson alloc] init];
[person setAge:10]; //这句会转换成objc_msgSend(person,@selector(setAge:),20);
他的作用:
*能获得某个类的所有成员变量
*能获得某个类的所有属性
*能获得某个类的所有方法
*交换方法实现(调用A的方法名但是会去执行B的方法)
*能动态添加一个成员变量
*能动态添加一个属性
*能动态添加一个方法
如果有这么个需求:要求对iOS8-和iOS8+的图片进行适配,不同系统版本显示不同的图片,并且在加载图片的时候做个图片是否加载成功做个判断
实现方法:
1.需求是对图片做操作,那么就要给UIImage搞个分类,然后导入消息机制头文件
#import<objc/message.h> 漏掉这个你是敲不出Method 类的
具体代码实现:
```code_lang
#import "UIImage+MyImage.h"
#import<objc/message.h>
@implementation UIImage (MyImage)
+(void)load
{
// 获取imageName地址
Method imageName = class_getClassMethod(self, @selector(imageNamed:));
// 获取imageWithName地址
Method imageWithName = class_getClassMethod(self, @selector(imageWithName:));
//交换两个方法的地址,实际上就是交换实现方式
method_exchangeImplementations(imageName, imageWithName);
}
// 既能加载图片又能打印
+ (instancetype)imageWithName:(NSString *)name
{
BOOL isiOS8= [[UIDevice currentDevice].systemVersion floatValue] >= 8.0;
UIImage *image = nil;
if (isiOS8) {
NSString *newName = [name stringByAppendingString:@"_iOS8+"];
image = [UIImage imageWithName:newName];
}
// 这里调用ImageWithName 相当于调用imageName
UIImage *image = [self imageWithName:name];
if (image == nil) {
NSLog(@"图片为空");
}
return image;
}
@end