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方法 因为两者已经调换
原理图