runtime认识及其用处

1、什么是运行时(runtime):

1> runtime是一套底层的C语言API(包含很多强大实用的C语言数据类型、C语言函数)

2> 实际上,平时我们编写的OC代码,底层都是基于runtime实现的

* 也就是说,平时我们编写的OC代码,最终都是转成了底层的runtime代码(C语言代码)

2、运行时(runtime)有啥好处:

runtime有啥用?

1> 能动态产生一个类、一个成员变量、一个方法

2> 能动态修改一个类、一个成员变量、一个方法

3> 能动态删除一个类、一个成员变量、一个方法

3、常见的函数、头文件

#import <objc/runtime.h> : 成员变量、类、方法

Ivar * class_copyIvarList : 获得某个类内部的所有成员变量

Method * class_copyMethodList : 获得某个类内部的所有方法

Method class_getInstanceMethod : 获得某个实例方法(对象方法,减号-开头)

Method class_getClassMethod : 获得某个类方法(加号+开头)

method_exchangeImplementations : 交换2个方法的具体实现

#import <objc/message.h> : 消息机制

objc_msgSend(....)

4、运行时的(runtime)运用

4.1 获取所有成员属性

4.1.1 自定义一个类:

#import <Foundation/Foundation.h>

@interface ICKPerson : NSObject

/** 年龄 */
@property (nonatomic,assign) NSInteger age;

/** 姓名 */
@property (nonatomic,copy) NSString * name;

/** 身高 */
@property (nonatomic,assign) float height;

/** 方法 */
- (void)eat;
- (void)read;
@end

@implementation ICKPerson
- (void)eat{}
- (void)read{}
@end

4.1.2 获取成员属性:

#import "ViewController.h"
#import "ICKPerson.h"
#import <objc/runtime.h>
@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 获取一个类的所有成员属性
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([ICKPerson class], &count);
    for (int i = 0; i<count; i++) {
        Ivar ivar = ivars[i];
        // 获取属性名
        const char *name = ivar_getName(ivar);
        // 获取属性类型
        const char *class = ivar_getTypeEncoding(ivar);
        NSLog(@"name:%s   class:%s",name,class);
    }
    // 释放ivars---C语言的在ARC中通过copy产生,需要手动释放
    free(ivars);
}
@end

4.1.3 测试结果打印:

4.2 获取其所有内部方法

    // 获取一个类的所有方法
    unsigned int count = 0;
    Method *methods = class_copyMethodList([ICKPerson class], &count);
    for (int i = 0; i<count; i++) {
        // 取出对应的i 位置方法
        Method method = methods[i];
       SEL sel = method_getName(method);
        NSLog(@"%@",NSStringFromSelector(sel));
    }
    free(methods);

打印结果:

4.3  交换两个方法的具体实现

4.3.1 交换方法

#import "ICKPerson.h"

#import <objc/runtime.h>

@implementation ICKPerson

+ (void)load
{
   // 交换吃和度的方法
    Method m1 = class_getInstanceMethod(self, @selector(eat));
    Method m2 = class_getInstanceMethod(self, @selector(read));
    method_exchangeImplementations(m1, m2);
}

- (void)eat{
    NSLog(@"---eat");
}

- (void)read{
     NSLog(@"---read");
}
@end

4.3.2 实现吃方法:

- (void)viewDidLoad {
    [super viewDidLoad];
    ICKPerson *person = [[ICKPerson alloc] init];
    [person eat];
}

// 打印结果

4.3.3 实现读方法:

- (void)viewDidLoad {
    [super viewDidLoad];
    ICKPerson *person = [[ICKPerson alloc] init];
    [person read];
}

// 打印结果

时间: 2024-08-01 07:39:27

runtime认识及其用处的相关文章

2.Java基础之Runtime对象

毕向东老师Java基础学习笔记——Runtime对象 今天学习Java中的Runtime对象后,感觉这个对象对我们主要有以下几点用处. 1.使用java代码打开本地可执行文件,比如打开一个计算器. 2.打开一个程序,并用该程序打开一个支持的文件. 比如:1.打开记事本,用记事本打开*.java文件, 2.打开暴风影音播放器,用播放器打开一个本地视频. 范例代码如下: /************************************** Runtime对象: 1.该类并没有提供构造函数.

iOS开发之runtime运行时机制

最近参加三次面试都有被问到runtime,也不知道面试官们自己懂不懂,反正就喜欢问,似乎就想把我唬住,来显示自己的对OC底层知识的理解很牛逼似的.(我现在开始看面试题,发现他们都喜欢问面试题的问题,我算明白了,都是应试教育惹的祸,大概他们以前没什么实际的app经验,所以准备了很多面试题,而我真的是能写app,先干活再找方法的人,面试不多,没什么面试经验,看来要开始碰壁多次才能掌握中国式面试).因为不太懂runtime我就只能支支吾吾的说点零碎.我真的好几次努力想看一看runtime的知识,因为知

使用OC runtime解决第三方库冲突

前几天在iOS app项目中添加了几个第三方库,各有各的用处,因为一些原因,有些库是不开源的. 添加后,发现app编译不通过,错误如下: 从错误描述中都能看出,app在连接过程中,发现了一些重复的符号,即同样的OC类和方法在不同的库中都有实现:liblibPDRCore.a和libsimpleconfiglib.a这两个库有冲突!恰好,这两个库都要用,而且都不开源,仿佛一下子就走进了死胡同,因为没有办法修改这两个库. 网上搜了一下,碰到这种问题的人还真不少,也提出了解决方案:用lipo命令分解其

java.lang.String cannot be cast to scala.runtime.Nothing Scala中的Nothing类型

经常在写Rdd的时候, 如:  val OWNER_ID=row.getAs("OWNER_ID")  等, 运行是可能会报异常 : java.lang.String cannot be cast to scala.runtime.Nothing 后检查后发现,其实应该保证类型一致,应该写成: val OWNER_ID=row.getAs[String]("OWNER_ID") 那么,问题来了, 为啥会有上面的异常出现.查询结果,觉得这篇文章有点意思,就摘抄过来了,

iOS runtime执行时具体解释

什么是runtime? runtime直译就是执行时间,run(跑,执行) time(时间),网上大家都叫它执行时,它是一套比較底层的纯C语言API,属于一个C语言库,包括了非常多底层的C语言API,它是OC的幕后工作者,我们平时写的OC代码,在执行过程时,都会转为runtime的C语言代码 runtime有什么用? 假设你之前不知道runtime,可能认为它没什么用,事实上他的作用很强大.以下我们就以代码的形式为大家揭开runtime的神奇面纱 作用1  获取一个类所有成员变量名(假设你的成员

iOS runtime运行时详解

什么是runtime? runtime直译就是运行时间,run(跑,运行) time(时间),网上大家都叫它运行时,它是一套比较底层的纯C语言API,属于一个C语言库,包含了很多底层的C语言API,它是OC的幕后工作者,我们平时写的OC代码,在运行过程时,都会转为runtime的C语言代码 runtime有什么用? 如果你之前不知道runtime,可能觉得它没什么用,其实他的作用非常强大.下面我们就以代码的形式为大家揭开runtime的神秘面纱 作用1  获取一个类全部成员变量名(如果你的成员私

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

常用工具类(System,Runtime,Date,Calendar,Math)

一.Sy 一个java.lang包中的静态工具类. 三大字段: static PrintStream err "标准"错误输出流. static InputStream in "标准"输入流. static PrintStream out "标准"输出流. 其他常用方法: 描述系统信息: 获取系统属性信息: static Properties getProperties(): (Properties是Hashtable的子类,也就是Map 的子类

Objective-C runtime初识

Objective-C Runtime Describes the macOS Objective-C runtime library support functions and data structures. Overview(概述) 以下是官方文档中对Runtime给出的定义 The Objective-C runtime is a runtime library that provides support for the dynamic properties of the Objecti