runtime:黑魔法之让人毫无知觉的修改类方法

Posted MakeKeyResuseable

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了runtime:黑魔法之让人毫无知觉的修改类方法相关的知识,希望对你有一定的参考价值。

如果我们想重写一个类的方法的时候,我们会考虑到用到哪些方法呢?

1.用分类:用分类主要的缺点是,分类是没有父类的,不能调用父类的方法。而且需要引入头文件,容易被人发现。

2.用继承:继承虽然虽然能实现重写父类的方法,但是动作太大,容易被人发现。

3.runtime:方法交换!虽然用到了分类,但是!不需要引入头文件!!

废话不多说,直接上代码

1.给UIColor写一个分类,并引入#import <objc/message.h>

#import <UIKit/UIKit.h>
@interface UIColor (extension)
+ (UIColor*)my_redColor;
@end
#import "UIColor+extension.h"
#import <objc/message.h>

@implementation UIColor (extension)
//这个方法会在加载这个分类的时候就调用
+ (void)load{
    Method redMethod = class_getClassMethod([UIColor class], @selector(redColor));
    Method myredMethod = class_getClassMethod([UIColor class], @selector(my_redColor));
    method_exchangeImplementations(redMethod, myredMethod);
}

+ (UIColor *)my_redColor{
    NSLog(@"111111");
    //1.直接修改改方法
    return [UIColor grayColor];
    
    //2.调用以前方法,需要注意的是,这个时候[UIColor my_redColor]其实执行的是:redColor 这个方法。这个时候如果用 [UIColor redColor] 会导致死循环。
//    return [UIColor redColor];
}
@end

2.无需任何引入等操作,只要在任何类里面调用[UIColor redColor],就会实现方法交换。

例如:控制器里 self.view.backgroundColor = [UIColor redColor];

以上是关于runtime:黑魔法之让人毫无知觉的修改类方法的主要内容,如果未能解决你的问题,请参考以下文章

iOS runtime探究: 从runtiem开始实践Category添加属性与黑魔法method swizzling

java黑魔法-反射机制-02-通过Java反射调用其他类方法

什么是method swizzling(俗称黑魔法)

Gradle 命令行黑魔法

Ruby黑魔法, 在不使用全局变量的情况下, 在方法作用域里修改局部变量的值

Ruby黑魔法, 在不使用全局变量的情况下, 在方法作用域里修改局部变量的值