iOS runtime(hook)

Runtime – 运行时(iOS的黑魔法!!)

runtime是OC的底层实现,可以静心一些非常底层的操作(OC无法办到的)

我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething];会被转化成objc_msgSend(target, @selector(doSomething));。

1、Runtime的使用

导入runtime头文件objc/runtime.h

对对象的操作!!

Method成员方法

Ivar成员变量

2、作用

1.利用runtime,在程序运行的过程中,动态创建一个对象!

2.利用runtime,在程序运行的过程中,动态的修改一个对象的方法\属性!

3、利用runtime下钩子

(1)创建categroy NSURL+url.h

.h文件

+(instancetype)MYXC_URLWithStr:(NSString*)str;



.m文件

/*  思路:HOOK 钩子  目的:整个项目 调用的都是系统的URLWithStr方法!        在运行的时候Hook住系统方法      修改成为自己的检测是否为空的方法!!  */

#import "NSURL+url.h"

#import <objc/runtime.h>

@implementation NSURL (url)

+(void)load{  

  //下钩子!!     //拿到两个Method    

Method URLWS = class_getClassMethod([NSURL class], @selector(URLWithString:));  

Method HKWS = class_getClassMethod([NSURL class], @selector(HK_URLWithStr:));   

 //交换方法实现    

method_exchangeImplementations(URLWS, HKWS);  

    }

 //强调:一定记得写注释!! //

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

  NSURL * url = [NSURL HK_URLWithStr:str];  

  if (!url) {

        NSLog(@"哥么为空!!!");  

  }    

return url; }

注:load方法会先于main方法执行

VC 中

- (void)viewDidLoad {

[superviewDidLoad];

//OC语言异常处理机制不太好!!

NSURL* url = [NSURLURLWithString:@"http://www.baidu.com/中文"];

NSLog(@"%@",url);}

只要调用 NSURLURLWithString  就会执行 MYXC_URLWithStr方法 因为两者已经调换

原理图


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

推荐阅读更多精彩内容