iOS Hook技术实现方法互换

相信大家都有想替换掉系统原生方法和许多第三方库私有方法的经历,那么通过method_exchangeImplementations可以实现这一想法

首先导入<objc/runtime.h>

#import <objc/runtime.h>

具体实现代码如下

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [ViewController AMethod];
    [self BMethod];
    
    //getClassMethod获取类方法
    Method AMethod = class_getClassMethod([self class], @selector(AMethod));
    
    //getInstanceMethod获取实例方法
    Method BMethod = class_getInstanceMethod([self class], @selector(BMethod));
    
    //交换IMP指针(每个方法都有相对应的IMP指针,exchangeImplementations可以交换两个方法的指针)
    method_exchangeImplementations(AMethod, BMethod);
    
    NSLog(@"-------分割线-------");
    
    [ViewController AMethod];
    [self BMethod];
}

//类方法
+ (void)AMethod
{
    NSLog(@"Im AMethod");
}

//实例方法
- (void)BMethod
{
    NSLog(@"Im BMethod");
}

那么遇到第三方库没有暴露的类,而你又想替换其方法的时候该怎么办呢?

首先你需要知道他的类名,和你想替换的该类的方法名。

具体步骤如下

//获取到未暴露的类
Class cls = NSClassFromString(@"未暴露的类名");

//拿到该类你想替换掉的方法
Method PMethod = class_getClassMethod(cls, @selector(你知道的该类的方法));

最后使用method_exchangeImplementations方法替换成你写的方法即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,808评论 0 9
  • 本文转载自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex阅读 4,166评论 0 1
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 4,104评论 0 2
  • 前言 runtime其实在我们日常开发过程中很少使用到,尤其是像我现在比较初级的程序猿就更用不到了。但是去面试很多...
    WolfTin阅读 3,899评论 0 2
  • 是的 我清晰的记起 我一遍又一遍的确定 我听见了梦的声音 说了什么 是语言里透露出的乡土气息 不再为追星逐月而着急...
    瞿静阅读 1,618评论 0 3