首先需要加上头文件#import<objc/runtime.h>和#Import<objc/message.h>
 
将A中的某个方法替换成B中某个方法,且没有任何的耦合
这里是RuntimeCar中的代码
+ (void)load {
    Class orginClass = NSClassFromString(@"Car”); // 这里我对Class的理解是指向这个自定义类的指针
    Class currentClass = [self class];
   
    SEL orginSelecter = NSSelectorFromString(@"run:”); // 个人感觉这个SEL是一个函数指针(这里对SEL和Method的理解是这样的,SEL是相对于Class的指向函数的一个指针;而Method是相对于整个内存指向函数的一个指针,Method是需要Class和SEL才能获得。也不知道这里理解的对不对?)
    SEL currentSelecter = @selector(runtime_run:);
   
    Method orginMethod = class_getInstanceMethod(orginClass, orginSelecter); // 这个Method似乎也是一个函数指针
    Method currentMethod = class_getInstanceMethod(currentClass, currentSelecter);
   
    BOOL results = class_addMethod(orginClass, currentSelecter, method_getImplementation(currentMethod), method_getTypeEncoding(currentMethod)); // 由A中引出一个指针指向B中需要替换的方法(感觉就是将B中的方法加到A中去)
   
    if (!results) {
        return;
    }
   
    orginMethod = class_getInstanceMethod(orginClass, currentSelecter); // 将Method重新指向,
    if (!orginMethod) {
        return;
    }

class_replaceMethod(orginClass, currentSelecter, method_getImplementation(orginMethod), method_getTypeEncoding(orginMethod));
    class_replaceMethod(orginClass, orginSelecter, method_getImplementation(currentMethod), method_getTypeEncoding(currentMethod));
}

- (void)runtime_run:(int)speed {
    if (speed < 120) {
        NSLog(@"%@ speed:%d", self, speed); // 这里self最后打印出来的,是Car
    } 
    NSLog(@"runtimeMethod");
}

在Car中只需要在.h和.m中加上相应的代码
最后直接调用Car中的run方法,对于什么时候运行的RuntimeCar中load方法
   网上资料:iOS会在运行期提前并且自动调用这两个方法+(void)initialize和+(void)load

初识runtime的更多相关文章

  1. 初识 Runtime

    前言 之前在看一些第三方源码的时候,时不时的能碰到一些关于运行时相关的代码.于是乎,就阅读了一些关于运行时的文章,感觉写的都不错,写此篇文章为了记录一下,同时也重新学习一遍. Runtime简介 Ru ...

  2. Runtime-b

    感谢大神分享 依旧是网上很多runtime的资料,依旧是看不懂,,,这里给大家转化一下runtime,使它由隐晦难懂变得通俗易懂. (虽然截图和语言组织的有些凌乱,但是大家还是一点一点的阅读下去吧,可 ...

  3. Objective-C 中的Runtime的使用

    Runtime的使用 一直以来,OC被大家冠以动态语言的称谓,其实是因为OC中包含的runtime机制.Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平 ...

  4. Objective-C runtime初识

    Objective-C Runtime Describes the macOS Objective-C runtime library support functions and data struc ...

  5. Runtime初识

    什么是Runtime   我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething];会被转化成objc_msgSend(target, @sel ...

  6. Java初识

    基础概念 特点: 完全面向对象,动态 解释性,简单.易移植,跨平台 安全健壮,高性能 多线程,分布式 三种核心机制: Java虚拟机 Java Virtual Machine 垃圾收集机制 Garba ...

  7. C#脚本引擎 CS-Script 之(一)——初识

    最近在做新产品,这个产品需要满足不同项目对于系统的定制性数据处理需求,比如有的要统计一段时间内某开关打开关闭了多少次,有的要统计一段时间内空调的使用率,有的希望根据温度来控制空调的开还是关,有的则是希 ...

  8. XSS 自动化检测 Fiddler Watcher & x5s & ccXSScan 初识

    一.标题:XSS 自动化检测 Fiddler Watcher & x5s  & ccXSScan 初识     automated XSS testing assistant 二.引言 ...

  9. iOS 开发-- Runtime 1小时入门教程

    1小时让你知道什么是Objective-C Runtime,并对它有一定的基本了解,可以在开发过程中运用自如. 三.Objective-C Runtime到底是什么东西? 简而言之,Objective ...

随机推荐

  1. Xshell + SVN使用

    切换目录 cd+想跳转到的目录下 文件浏览 ls ll (ll 信息全) svn更新 svn up 编辑 vi vi的命令 文件保存与退出: :q 在文件未作任何修改的情况下退出. :q! 强制退出, ...

  2. H3C CIDR

  3. vue 路由跳转前确认框,刷新浏览器页面前提示确认框

    先看效果图: 1.刷新页面效果: 2.跳转路由(进入别的页面前)效果: 代码: // 路由跳转确认 beforeRouteLeave(to, from, next) { const answer = ...

  4. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(7)之扩展基类和区域创建以及文本编辑配置

    一.扩展基类和区域创建 (1)在应用之前,我们先在表现层创建一个公共的系统扩展文件来(SystemExtension)存放我们需要延伸和扩展的方法类. 在常规的项目系统操作中,我们都需要用到增删查改的 ...

  5. gitLab操作规范和项目流程

    刚做完一个项目并且艰难得上线,对整个项目流程和gitLab规范 有了一些心得,给新来的同学普及一下. 最先产品会写一篇需求文档,咱们要先看需求文档对项目有一个大致了解,然后产品喊后端.ui.前端  一 ...

  6. codeforces 540E 离散化技巧+线段树/树状数组求逆序对

    传送门:https://codeforces.com/contest/540/problem/E 题意: 有一段无限长的序列,有n次交换,每次将u位置的元素和v位置的元素交换,问n次交换后这个序列的逆 ...

  7. CITRIX ADC配置SSL卸载

    如上图,将ssl的加密解密放在前端的负载均衡设备上,客户端到VPX的访问都是加密的,VPX到后端的服务器都是http的 Step1:上传证书到VPX,如下图: Step2:创建SSL的虚拟服务器并且绑 ...

  8. Java 8 默认接口实现及其他语言特性

    一.为什么有默认接口实现 1.由于Java 8的API在现存的接口上引入了非常多的新方法(如List接口上的sort方法).在原有语法基础上,如Guava和Apache Commons这样的框架都需要 ...

  9. 如何把对象手动注入Spring容器并实现依赖注入

    将对象注入到Spring容器并实现依赖注入 public class UserDao { @Resource AccountService accountService; public void pr ...

  10. DEVOPS技术实践_19:Pipeline的多参数json调用

    在上一篇学习了把参数写进Json文件,然后通过去Json文件,调用参数的方法 1. 三元运算符介绍 调用的方法是通过一个三元运算符实现的 gender = prop.GENDER? prop.GEND ...