Runtime – 運行時(iOS的黑魔法!!)
runtime是OC的底層實現(xiàn),可以靜心一些非常底層的操作(OC無法辦到的)
我們寫的代碼在程序運行過程中都會被轉(zhuǎn)化成runtime的C代碼執(zhí)行,例如[target doSomething];會被轉(zhuǎn)化成objc_msgSend(target, @selector(doSomething));肌索。
1诚亚、Runtime的使用
導(dǎo)入runtime頭文件objc/runtime.h
對對象的操作!!
Method成員方法
Ivar成員變量
2、作用
1.利用runtime,在程序運行的過程中,動態(tài)創(chuàng)建一個對象!
2.利用runtime,在程序運行的過程中,動態(tài)的修改一個對象的方法\屬性!
3闸准、利用runtime下鉤子
(1)創(chuàng)建categroy?NSURL+url.h
.h文件
+(instancetype)MYXC_URLWithStr:(NSString*)str;
.m文件
/* ?思路:HOOK 鉤子 ?目的:整個項目 調(diào)用的都是系統(tǒng)的URLWithStr方法! ? ?? ? 在運行的時候Hook住系統(tǒng)方法 ?? ? 修改成為自己的檢測是否為空的方法!! ?*/
#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:)); ??
?//交換方法實現(xiàn) ? ?
method_exchangeImplementations(URLWS, HKWS); ?
? ? }
?//強(qiáng)調(diào):一定記得寫注釋!! //
+(instancetype)HK_URLWithStr:(NSString *)str {
? NSURL * url = [NSURL HK_URLWithStr:str]; ?
? if (!url) {
? ? ? ? NSLog(@"哥么為空!!!"); ?
? } ? ?
return url; }
注:load方法會先于main方法執(zhí)行
VC 中
- (void)viewDidLoad {
[superviewDidLoad];
//OC語言異常處理機(jī)制不太好!!
NSURL* url = [NSURLURLWithString:@"http://www.baidu.com/中文"];
NSLog(@"%@",url);}
只要調(diào)用?NSURLURLWithString ?就會執(zhí)行?MYXC_URLWithStr方法 因為兩者已經(jīng)調(diào)換
原理圖