iOS Runtime之方法交换

iOS Runtime之方法交换

  • 场景
  • 探寻
    • 核心点
    • 代码实现
  • 其他

场景

当遇到想要一些特殊场景可能需要用到方法交换,或者给原油方法增加一些新的实现。例如:

  • 给系统API增加一些额外功能,比如字符串校非空判断等等。
  • 比如线上动态控制一些功能的切换。
  • 其他等等。

探寻

核心点

  1. 方法交换API
    method_exchangeImplementations能交换两个方法的实现。
  2. 方法获取
    class_getInstanceMethod/class_getClassMethod获取实例方法或者类方法。
  3. 增加方法实现
    如果时想要增加方法实现,而不是方法交换,则在方法实现里增加自身的调用。

方法交换交换了方法的实现,因此想要调用原方法的实现,只需要调用一次当前方法的方法名即可。

代码实现

#import "JX_ExchangeFuncViewController.h"
#import <objc/runtime.h>

@interface JX_ExchangeFuncViewController ()

@end

@implementation JX_ExchangeFuncViewController
+ (void)load {
    Method method1 = class_getInstanceMethod(self.class, @selector(func1));
    Method method2 = class_getInstanceMethod(self.class, @selector(func2));
    method_exchangeImplementations(method1, method2);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self func1];
}

- (void)func1 {
    NSLog(@"is func1 imp");
}
- (void)func2 {
    [self func2];
    NSLog(@"is func2 imp");
}
@end



其他

没有其他。

你可能感兴趣的:(ios,cocoa,macos)