Objective-CiOS开发技术集合天生不是作曲家

Runtime

2015-09-04  本文已影响904人  FMG

        最近想找有关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

       

上一篇下一篇

猜你喜欢

热点阅读