runtime --- 方法实现交换

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000 }
span.s1 { }

方法欺骗  使用 runtime 进行两个方法的交换

+ (void)load {
    //获取类方法
    Method olld = class_getClassMethod([self class], @selector(URLWithString:));

    Method new = class_getClassMethod([self class], @selector(AZ_URLWithString:));
    //交换两个方法的实现
    method_exchangeImplementations(olld, new);

}

+ (instancetype)AZ_URLWithString:(NSString *)str{

    NSURL *url  =[NSURL AZ_URLWithString:str];
    if (!url) {
        NSLog(@"交换方法");
    }
    return url;
}
时间: 2024-10-15 01:38:39

runtime --- 方法实现交换的相关文章

RunTime 方法交换 NSURL 空值处理

RunTime 消息机制 Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制.而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库.它是 Objective-C 面向对象和动态机制的基石. 消息机制是运行时里面最重要的机制,OC是动态语言,本质都是发送消息,每个方法在运行时会被动态转化为消息发送,即:objc_msgSend(receiver, selector) RunTime 官方API NSURL 空值处理 使用runti

runtime 方法替换 和 动态添加类方法 结合使用

原文地址:runtime 方法替换 和 动态添加类方法 结合使用 前言:方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法. 缺陷:1.含参数的方法难以处理,参数值需要根据实际业务逻辑而定.2.无法实现动态添加实例方法. Create Person.h and Person.m Person.h: 12345 #import <Foundation/Foundation.h> @int

iOS开发大招-使用运行时runtime方法给一个类添加属性

看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性, 比如PPrealSideController 就给 UIViewController添加了一个 self.pprealSideController的属性? 他是如何实现的呢? 1.基本的实现思路 首先我们需要了解,实际上 在我们使用  类似于self.newProperty的语句的时候, 根据点语法的规则实际上是调用的  setNewProperty方法,和  newProperty方法, 那我们可以知道他肯

Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件

Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件 交换文件 查看内存:free -m , -m是显示单位为MB,-g单位GB 创建一个文件:touch /root/swapfile 使用dd命令,来创建大小为2G的文件swapfile: dd if=/dev/zero of=/root/swapfile bs=1M count=2048 //命令执行完需要等待一段时间 if表示input_file输入文件 of表示output_file输出文件 bs表示block_siz

Runtime 方法替换 和 动态添加实例方法 结合使用

前言:方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法,这个方法可以是类方法也可以是实例方法,这个外部类也可以是没有任何方法声明和实现的类. 主要思路:使用运行时的方法替换将在外部类将自定义方法hy_resolveInstanceMethod或hy_resolveClassMethod(用hy_前缀表示是我自定义的方法)和需要被添加的类中的resolveInstanceMethod或者

Runtime方法的使用—Object篇

本篇主要是Object相关的方法调用 完整代码在这里 #pragma mark - IBAction - (IBAction)logRunTimeAction:(id)sender { objc_property_attribute_t attrs[] = { { "T", "@\"NSString\"" }, { "&", "N" }, { "V", ""

Runtime 应用(一)拦截系统自带的方法交换实现

动态的交换方法能够给项目中大量已经使用的方法 进行拦截增加操作 实践:利用运行时交换系统的ImageNamed:方法 应用背景 当系统需要适配ios7和ios8时可能会有显示不同图片的需求,但在老项目上开发ios7程序时并未考虑到ios8的适配,当项目上有几百处地方用到ImageNamed:方法时,如果选用最直接的办法,在该方法之前进行判断,如果为ios8就显示另外一张图片,这样的工作量明显会很大,所以可以用运行时的方法来解决. 新建一个项目,准备两张图片,一张图片名为close为ios7而准备

iOS 为何使用runtime多次方法交换后却能按照交换顺序依次执行代码逻辑?

题目: 假设我们有一个ViewController, Category A(ViewController), Category B(ViewController), Category C(ViewController) 4个文件, 其中3个category中都实现了自定义viewDidLoad方法, 会对ViewController中的ViewDidLoad方法进行方法替换, 那么依次替换后(A B C)的方法执行顺序是什么呢? 记method_exchangeImplementations(M

runtime总结二之消息机制(包括消息转发,消息交换的黑魔法)

runtime的消息机制 前面提到过编译器最终会把我们的消息发送转化为函数调用 消息发送 [object sendMassage] 首先编译器会在运行时将上面的例子转化为objc_msgSend(obj,@selector(sendMassage))这个函数,转换的时候除了方法本身的参数之外,还有两个隐藏的参数一个是id类型的,代表对象的类型,还是一个是SEL类型的,是函数对应的方法的编号,接下来就会按照下面的流程来调用这个方法 通过obj的isa指针找到其所对应的类. 通过SEL先去类的cac