美文网首页
Runtime使用

Runtime使用

作者: 风雨彩虹_123 | 来源:发表于2021-09-29 20:08 被阅读0次

获取isa指向的Class,如果person是实例对象,获取得是类对象。如果person是类对象,获取得是元类对象
object_getClass(person)
获取父类
class_getSuperclass([person class])

//设置isa指向的Class

 #import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import "Person.h"
#import "Cat.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc]init];
        [person run];
        object_setClass(person,[Cat class]);
        [person run];
    }
    return 0;
}

//运行结果为:
2021-09-29 11:29:14.438525+0800 Test[47604:2583284]  -[Person run]
2021-09-29 11:29:14.439851+0800 Test[47604:2583284]  -[Cat run]

iOS的KVO实现就使用到这个API,系统会将isa指针设置为被观察的衍生子类。

判断一个OC对象是否为Class
object_isClass(person)
判断一个class对象是否为元类
class_isMetaClass([person class]);

动态创建类、成员变量、方法

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建类
        Class newClass = objc_allocateClassPair([NSObject class], "Gog", 0);
        //添加成员变量,不能放到注册类的后面,成员变量存储在 class_ro_t只读的数据结构
        // 8 : 代表成员变量占用内存大小    1 : 对齐方式,此处固定写1
        class_addIvar(newClass, "_name", 8, 1, "@");
        //添加方法。可以放在注册类后,方法放在class_rw_t中,是可读可写得数据结构
        class_addMethod(newClass, @selector(run), (IMP)run, "v@:");
        //注册类
        objc_registerClassPair(newClass);
        id dog = [[newClass alloc] init];
        //成员变量没有set,get方法,不能使用点语法,只能使用Kvc进行赋值取值
        [dog setValue:@"abc" forKey:@"_name"];
        NSLog(@"%@",[dog valueForKey:@"_name"]);
        [dog run];
        
    }
    return 0;
}

//运行结果为:
2021-09-29 15:58:49.216396+0800 Interview01-cache[48615:2661474] abc
2021-09-29 15:58:49.217449+0800 Interview01-cache[48615:2661474] <Gog: 0x10071b8e0>  run

获取成员变量信息及赋值与取值

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    Person *person = [[Person alloc]init];
         //获取成员变量信息
       Ivar ageIvar = class_getInstanceVariable([Person class], "_age");
        Ivar nameIvar = class_getInstanceVariable([Person class], "_name");
        NSLog(@"%s   %s",ivar_getName(ageIvar),ivar_getName(nameIvar));
        //设置和获取成员变量的值
        object_setIvar(person, ageIvar, @10); //方法第三个参数必须传OC对象类型的值,如果传入基本类型的值会报错  No matching function for call to 'object_setIvar'   
         object_setIvar(person, ageIvar,  (__bridge id)(void *)10) ; //经过这样转换就可以成功
        object_setIvar(person, nameIvar, @"abc");
        NSLog(@"%d   %@",person.age,person.name);
        
    }
    return 0;
}

//运行结果为:
2021-09-29 16:51:37.145394+0800 Interview01-cache[48878:2680369] _age   _name
2021-09-29 16:51:37.146843+0800 Interview01-cache[48878:2680369] -753417967   abc

从上面代码运行结果我们发现_age的值没有设置成功,因为我们在设置值时将它包装成了NSNumber类型,再赋值给int是会失败,object_setIvar 方法有不允许我们直接传int类型的值,所以我们想给基础类型的成员变量赋值是可以使用kvc

成员变量的数量

  unsigned int count;
  Ivar *ivars = class_copyIvarList([MJPerson class], &count); //返回的是数组,指针可以当做数组使用
  for (int i = 0; i < count; i++) {
        //取出i位置的成员变量
         Ivar ivar = ivars[i];
         NSLog(@"%s  ",ivar_getName(ivar));
     }
    free(ivars);

什么是Runtime?平时项目中有用过么?
OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行
OC的动态性就是有Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数
平时编写的OC代码,底层都是转换成了RuntimeAPI进行调用的
利用关联对象给分类添加属性
遍历类的所有成员变量(修改私有变量,字典转模型,归档解档)
交换方法实现(交换系统的方法)
利用消息转发机制解决方法找不到的问题

相关文章

  • Runtime

    Runtime:运行时使用Runtime就是使用苹果提供的API使用Runtime可以实现OC无法实现的:1.使用...

  • runtime的用法

    1.使用runtime改变变量值 2.使用runtime交换方法 3.使用runtime添加方法 4.使用runt...

  • runTime常用方法

    使用runTime改变实例成员的值 使用runtime来交换两个方法 注意再次调用该方法不交换 使用runTime...

  • Objective-C runtime 详解

    Objective-C runtime 介绍 使用 runtime Objective c 使用系统的 runt...

  • iOS Runtime 使用

    使用runtime 首先需要导入#import runtime拷贝 objc_s...

  • Runtime全面剖析之原理篇

    如果想了解Runtime的实际应用请看Runtime全面剖析之简单使用 一:Runtime简介二: Runtime...

  • Runtime知识梳理

    补一下:runtime使用DEMO 以前对runtime的使用和了解都很模糊。这段时间,把runtime机制好好学...

  • Runtime

    Runtime的使用 .h .m #import

  • 使用Process执行外部命令

    1. Runtime 使用Runtime方法执行外部命令 2. ProcessBuilder 也是使用Proces...

  • 谈Runtime机制和使用的整体化梳理

    谈Runtime机制和使用的整体化梳理 谈Runtime机制和使用的整体化梳理

网友评论

      本文标题:Runtime使用

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