Runtime

作者: FMG | 来源:发表于2015-09-04 00:07 被阅读904次

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

           

    相关文章

      网友评论

      本文标题:Runtime

      本文链接:https://www.haomeiwen.com/subject/cekiqttx.html